c++ - 为什么这个可变函数不明确?

标签 c++ variadic-templates c++11

这与 my earlier post 有关.我想知道为什么一种尝试的解决方案不起作用。

template <typename... T>             /* A */
size_t num_args ();

template <>
size_t num_args <> ()
{
    return 0;
}

template <typename H, typename... T> /* B */
size_t num_args ()
{
    return 1 + num_args <T...> ();
}

如果我试着打电话,比方说,num_args<int,float>()那么错误是函数调用不明确:

  • A 和 T={int,float}
  • B,H=int,T={float}

我不明白这是怎么模棱两可的——A 是声明,B 是 A 声明的函数的定义。对吗?

我正在尝试制作 this example工作和对我之前的问题的回答似乎声称它永远无法工作。

如果是这样,可变自由函数的意义何在?他们可以做什么?

最佳答案

I don't understand how this is ambiguous -- A is a declaration and B is a definition of the function declared by A. Right?

没有。 A 是函数模板的声明,B 是另一个函数模板的声明(和定义)。

编译器无法在两者之间做出决定:它们都没有参数,并且模板参数是两者的匹配项。

中间的是 A 中声明的函数模板的显式全特化。

如果你试图让 B 成为 A 的另一个特化:

template <typename H, typename... T> /* B */
size_t num_args<H, T...>()
{
    return 1 + num_args <T...> ();
}

...您最终会得到函数模板的部分特化,这是不允许的。

您可以通过使用具有部分特化的类模板和调用类模板的函数模板的常用技巧来做到这一点:

template <typename... T>
class Num_Args;

template <>
struct Num_Args <>
{
    static constexpr size_t calculate() {
        return 0;
    }
};

template <typename H, typename... T>
struct Num_Args <H, T...>
{
    static constexpr size_t calculate() {
        return 1 + Num_Args<T...>::calculate();
    }
};

template <typename... T> /* B */
constexpr size_t num_args ()
{
    return Num_Args<T...>::calculate();
}

关于c++ - 为什么这个可变函数不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7109420/

相关文章:

c++ - 默认参数后的可变参数是否格式正确?

c++ - 将 crtp 与公共(public)接口(interface)类一起使用时,如何避免虚拟调用开销?

c++ - 排序 vector 上 std::lower_bound 的时间复杂度

c++ - 我应该有一个分配器作为我的类中的成员变量吗?

C++ 隐式函数调用

c++ - 可以在 C++ 中将类声明为静态的吗?

c++ - 涉及非推导参数包的函数指针参数类型模板实参推导

c++ - cpp 多维 vector

c++ - 使用单参数模板化构造函数从引用元组构造值元组

c++ - 我的 2D 迷宫解算器无限递归并且出现堆栈溢出 - 为什么?