【问题标题】:Difference in using function type vs function pointer as C++ template function parameter?使用函数类型与函数指针作为 C++ 模板函数参数的区别?
【发布时间】:2014-02-17 23:02:10
【问题描述】:

Syntax of C++ templates with function type parameters有些相关,但无法摆脱我的所有疑虑。

两者有什么区别(如果有的话)

template <void F(int)> 
void fun1 (int a) {F(a);}

template <void (*F)(int)> 
void fun2 (int a) {F(a);}

?

我尝试用类似的东西实例化两者

void called (int arg)
{
 ...
}

int main()
{
   fun1(10);
   fun2(20);
   return 0;
}

查看从 clang 3.4 和 gcc-4.8(两者均为 -O0)生成的汇编代码,我看不出有任何区别。

我知道函数的名称在作为参数传递时会衰减为指向其类型的指针,但无法清楚地解释在上述模板实例化期间使用它时会发生什么。 我会说第一个模板中的“F”是“某物”的类型,可以使用 int 参数调用并且不返回任何内容,而第二个模板中的“F”是指向此类“某物”的指针,并且在这两种实现中,F 的使用方式与直接使用函数名和通过函数指针使用函数名时的使用方式相同。 我认为这与函数名称如何衰减为指针密切相关,但我对标准的哪一部分对此进行了形式化有点困惑。

【问题讨论】:

    标签: c++ templates function-pointers


    【解决方案1】:

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

    [C++ 11 标准,第 14.1 节 [temp.param],第 8 段]

    【讨论】:

    • 这似乎有点类似于数组和函数在作为参数传递给函数时所经历的指针衰减
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多