c++ - 函数指针和模板

标签 c++ templates visual-c++

为什么下面的代码有效?

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/

相关文章:

c++ - 为什么这个程序编译失败时会报错unreachable?

c++解析异常类中的参数

c++ - 为什么这个程序会崩溃:在 DLL 之间传递 std::string

android - 导出 C 局部变量 : JNI run-time behavior issue

c++ - 使用模板、异或和指向内存的指针进行非常残酷的交换

c++ - 从模板参数的模板参数中提取值

c++ - sqlite3_get_table 的替代品

c++ - 在对象(不是指针)的 std::vector 上调用 push_back 有严重的副作用。那么指针会更好吗?

函数模板的 C++ 问题(未找到实例)

c++ - 在 MSVC 11 中 boost "destructor is not virtual"错误