gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:00:24 24 4
gpt4 key购买 nike

这与 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com