【问题标题】:Passing functions as variadic template arguments, and calling them [duplicate]将函数作为可变参数模板参数传递,并调用它们[重复]
【发布时间】:2018-11-07 18:57:49
【问题描述】:

我想通过将其他几个函数相加来创建一个“总计”函数。这可以在编译时完成,所以我认为递归可变参数函数模板将是一个很好的解决方案。到目前为止我的代码:

int One(){return 1;}
int Two(){return 2;}
int Three(){return 3;}

using func_t = int(void);

//Base case
template <func_t F>
int Total() {
    return F();
}

template <func_t F, func_t... Fs>
int Total() {
    return F() + Total<Fs...>();
}

int main(int argc, char *argv[])
{
    cout << Total<One, Two, Three>() << endl;
    return 0;
}

但是,我收到 MSVC 编译器错误 C2668: 'Total': ambiguous call to overloaded function;可以是int Total&lt;int Three(void),&gt;(void)int Total&lt;int Three(void)&gt;(void)

我不明白为什么编译器有两个相似的候选函数模板,唯一的区别是一个有一个额外的逗号。

【问题讨论】:

  • 如果可以使用C++17,就可以避免递归,使用模板折叠,只需写template &lt;func_t ... Fs&gt; int Total () { return (Fs() + ...); }

标签: c++ variadic-templates


【解决方案1】:

您的基本情况声明不正确,导致编译器无法区分对基本情况的调用和对递归基的调用。

如果您将基本案例设为空的模板列表,则不再有歧义。

template <class none = void>
int Total() {
    return 0;
}

【讨论】:

  • 当然,在我发布问题后,我在另一个帖子中找到了同样的答案:stackoverflow.com/questions/7973827/…
  • @Carlton,我们是否应该将这个问题作为重复项结束?
  • 是的,继续...
猜你喜欢
  • 1970-01-01
  • 2014-10-20
  • 2013-05-25
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2011-03-16
相关资源
最近更新 更多