C++ 为什么可以';这个参数包是否接受函数指针?

C++ 为什么可以';这个参数包是否接受函数指针?,c++,variadic-templates,C++,Variadic Templates,我试图创建一个充满函数指针的参数包,但是GCC(使用c++17标准)生成了一个推断失败错误。为什么呢 如文所述: 对于函数指针,有效参数是指向具有链接的函数的指针(或计算为空指针值的常量表达式) 在我的例子中,情况就是这样(不是吗?) 对于参数包,此规则是否无效?我在标准中遗漏了什么吗?如果是这种情况,我如何修复代码,而不将函数指针作为函数参数传递(即不声明T run2(T input,Funcs…Funcs) //在f.hpp中 模板 T运行2(T输入) { 返回输入; } 模板 T运行2(T

我试图创建一个充满函数指针的参数包,但是GCC(使用c++17标准)生成了一个
推断失败
错误。为什么呢

如文所述:

对于函数指针,有效参数是指向具有链接的函数的指针(或计算为空指针值的常量表达式)

在我的例子中,情况就是这样(不是吗?)

对于参数包,此规则是否无效?我在标准中遗漏了什么吗?如果是这种情况,我如何修复代码,而不将函数指针作为函数参数传递(即不声明
T run2(T input,Funcs…Funcs)

//在f.hpp中
模板
T运行2(T输入)
{
返回输入;
}
模板
T运行2(T输入)
{
返回run2(f(输入));
}
//以m.cpp为单位
无符号add2(无符号v)
{
返回v+2;
}
int main()
{
无符号a=1;
a=run2(a);//有效
a=run2(a);//不起作用
std::cout您声明了一个类型参数包,
class…Funcs
。您不能将函数指针作为类型参数的参数传递,因为它们是值,而不是类型。相反,您需要声明
run2
模板,以便它有一个函数指针模板参数包。执行此操作的语法如下:

template<typename T, T(*f)(T), T(*...fs)(T)>
T run2(T input)
{
    return run2<T, fs...>(f(input));
}
模板
T运行2(T输入)
{
返回run2(f(输入));
}
(规则是,
是声明器id的一部分,位于标识符前面,即
fs

fs
可以接受一个或多个
T(*)(T)类型的函数指针

您声明了一个类型参数包,
class…Funcs
。您不能将函数指针作为类型参数的参数传递,因为它们是值,而不是类型。相反,您需要声明
run2
模板,以便它有一个函数指针模板参数包。执行此操作的语法如下:

template<typename T, T(*f)(T), T(*...fs)(T)>
T run2(T input)
{
    return run2<T, fs...>(f(input));
}
模板
T运行2(T输入)
{
返回run2(f(输入));
}
(规则是,
是声明器id的一部分,位于标识符前面,即
fs


pack
fs
可以接受一个或多个类型为
T(*)(T)

class…
的函数指针是一组类型,但是调用
run2
的第三个参数是一个函数(
add2
)。这就是主要错误的来源。
class…
是一组类型,但是调用
run2
的第三个参数是一个函数(
add2
)。这就是主要错误的来源。我怎么会错过这个…非常感谢!我怎么会错过这个…非常感谢!