为什么下面的代码有效?
class foo {
public:
template <typename F>
int Map(F function) const {
return function(2);
}
};
int Double(int n) {
return 2*n;
}
int main(){
foo f;
int n = f.Map(Double);
}
我的理解是接受函数指针的函数必须有这样的格式:
void foo(int (*ptf)(int))
所以Map函数应该是这样的
int Map(int (*ptf)(int)){
return (*ptf)(2);
}
它是否以某种方式在运行时或编译时通过模板解析函数? 以上代码在vc++ 2010编译运行
最佳答案
模板是一个编译时的概念,所以当然会在编译时解决(如果你的意思是模板参数替换)。尝试传递一些你不能调用的东西,比如 function(2)
,例如,一些 int
。这将产生编译时错误。替换后,您的函数将如下所示
int Map(int (*function)(int)){
return function(2);
}
您并不明确需要取消引用函数指针,因为 function(2)
和 (*function)(2)
立即转换为所谓的函数指示符。它本身又是可取消引用的,你可以构建一个无尽的链:(***********function)(2)
仍然有效,并且仍然与 function 相同(2)
和 (*function)(2)
。
关于c++ - 函数指针和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6460833/