如何解决函数指针和模板
| 为什么以下代码有效?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中运行
解决方法
模板是一个编译时概念,因此当然可以在编译时解决(如果您的意思是模板参数替换)。尝试传递诸如call3ѭ之类无法调用的东西,例如some4ѭ。这将产生一个编译时错误。替换后,您的函数将如下所示
int Map(int (*function)(int)){
return function(2);
}
您不需要显式地取消引用函数指针,因为function(2)
和(*function)(2)
都将立即转换为所谓的函数指示符。它本身又是可取消引用的,因此您可以构建一个无穷的链:(***********function)(2)
仍将起作用,并且仍与function(2)
和(*function)(2)
相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。