2013-03-02 296 views
2

我有这样的问题:函数模板参数和模板成员函数参数

template <void (*F)(int)> struct FunctionWrapper // This compiles and works 
{ 
    static void call_it() 
    { 
     F(0); 
    } 
}; 

class MyClass 
{ 
public: 
    static void callMe(int k) 
    { 
    } 
}; 

template <void (MyClass::*F)(int)> struct FunctionWrapper // Error - F incompatible with declaration 
{ 
    static void call_it() 
    { 
     MyClass::F(0); 
    } 
}; 

为什么我可以用一个函数指针(编译时间常数),但不是一个班的成员(甚至是静态的)吗?

+0

你想用你的包装达到什么目的?你有没有考虑过std :: function? – 2013-03-02 15:28:11

+0

我想在我的模板的参数列表中有一个类成员函数,有可能吗? – 2013-03-02 15:44:55

回答

0

为什么我可以使用函数指针(编译时间常量)而不是类成员(甚至静态)?

您可以使用指向静态函数的指针作为常规函数指针。例如,下面的工作:

template <void (*F)(int)> struct FunctionWrapper 
{ 
    static void call_it() 
    { 
     F(0); 
    } 
}; 

class MyClass 
{ 
public: 
    static void callMe(int k) 
    { 
    } 
}; 

int main() 
{ 
    FunctionWrapper<&MyClass::callMe> obj; 
    obj.call_it(); 
} 

关于你的尝试,这是款C++ 11标准规定的14.1/4:

非类型模板参数应有一以下的(任选CV修饰)类型:

- 积分或枚举类型,

- 指向对象或函数指针

- 左值参考到对象或左值参照功能,

- 指针构件,

- 的std :: nullptr_t。

一个指向构件函数(即使static)不是用于非类型模板参数的选项。

+0

因此,类成员函数不是编译时常量?怎么来的?我认为代码是在所有类实例中共享的。也许我需要至少有一个类的实例来使这些代码可用? – 2013-03-02 15:38:18

+0

我的意思是一个“非静态”类成员函数 – 2013-03-02 16:13:01

+0

@PasterKeller:请参阅编辑我的答案。 – 2013-03-02 16:21:44

2

静态函数具有与正常函数相同的类型签名;它不是真正的会员功能。