函数指针和模板

时间:2011-06-23 21:29:18

标签: 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中编译和运行的

1 个答案:

答案 0 :(得分:5)

模板是一个编译时的概念,所以当然它会在编译期间解决(如果你的意思是模板参数替换)。尝试传递一些您无法调用的内容,例如function(2),例如某些int。这将产生编译时错误。替换后,您的函数将如下所示

int Map(int (*function)(int)){
    return function(2);
}

您没有明确需要取消引用函数指针,因为function(2)(*function)(2)都立即转换为所谓的函数指示符。这本身再次被解除引用,你可以建立一个无穷无尽的链:(***********function)(2)仍然可以工作,并且仍然与function(2)(*function)(2)相同。