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

标签 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:“总计”:对重载函数的模糊调用;可能是 int Total<int Three(void),>(void)int Total<int Three(void)>(void)

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

最佳答案

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

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

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

关于c++ - 将函数作为可变参数模板参数传递,并调用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53196031/

相关文章:

C++ - 如何找到矩阵的等级

c++ - 是否有任何 C 或 C++ 编译器在定义宏中进行优化?

c++ - 调试打印解压缩可变参数模板函数参数

c++ - 指向可变模板静态函数的指针。如何?

c++11 - 从可变参数类模板为每种类型生成一个方法

C++ WTSQueryUserToken 函数错误

c++ - 使用Opengl绘制立方体3D

c++ - 使用 std::tie 比较结构

c++ - 可变参数模板,编译器道歉

c++ - 在可变参数模板内使用 std::bind 完美转发引用