将函数作为可变参数模板参数传递并调用它们

时间:2018-11-07 18:57:50

标签: c++ variadic-templates

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

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':对重载函数的模棱两可的调用;可以是int Total<int Three(void),>(void)int Total<int Three(void)>(void)

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

1 个答案:

答案 0 :(得分:2)

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

如果将基本情况设为模板的空列表,则不再存在歧义。

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