Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板参数";“功能类型”;及;函数指针";。什么时候申请什么?_C++_Templates - Fatal编程技术网

C++ 模板参数";“功能类型”;及;函数指针";。什么时候申请什么?

C++ 模板参数";“功能类型”;及;函数指针";。什么时候申请什么?,c++,templates,C++,Templates,我试图理解作为模板参数的“函数类型”和“函数指针”之间的区别,以及何时应用什么。或者,有什么区别 简单的例子: template <int Function(int)> struct S1 { //.... }; template <int (*Function)(int)> struct S2 { //.... }; int always42(int) { return 42; } int main() { S1<always

我试图理解作为模板参数的“函数类型”和“函数指针”之间的区别,以及何时应用什么。或者,有什么区别

简单的例子:

template <int Function(int)>
struct S1 {
    //....
};
template <int (*Function)(int)>
struct S2 {
    //....
};

int always42(int) {
    return 42;
}

int main() {

    S1<always42> s1;
    S2<always42> s2;
    //....
    return 0;
}
模板
结构S1{
//....
};
模板
结构S2{
//....
};
int always42(int){
返回42;
}
int main(){
S1;
S2;
//....
返回0;
}
还是“函数类型”会退化为“函数指针”


有人能解释一下吗?

两个模板参数都是
int(*)(int)
,因为
int(int)
存在类型衰减。也就是说,指定为
int(int)
的非类型模板参数的类型将衰减为
int(*)(int)

通过使用下面不完整的
type\u
类模板,可以看到两个模板参数对应于相同的类型:

template<typename> struct type_shower;

template <int Function(int)>
struct S1 {
   type_shower<decltype(Function)> _;
};

template <int (*Function)(int)>
struct S2 {
   type_shower<decltype(Function)> _;
};
错误:未定义模板的隐式实例化



是,函数类型调整为函数指针

数组和函数类型可以写在模板声明中,但它们会根据需要自动替换为指向对象的指针和指向函数的指针

将类型为“T数组”或函数类型为T的非类型模板参数调整为类型为“指向T的指针”


你的“类型淋浴”方法很好。让编译器通过错误消息给出证据。真的很好。我不完全理解您上次关于引用类型的编辑。没有任何“功能类型”会衰退。它已经是“对函数的引用”。或者您是否想说,“函数引用”不会衰减为“函数指针”。那我就明白了。无论如何+1您的第二种解释:如果为非类型模板参数指定的类型是引用,它不会衰减为指针。非常感谢您提供的链接和引用。对不起,我是瞎子+1.
template <int (&Function)(int)>
struct S3 {
   type_shower<decltype(Function)> _;
};