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); 
    }
};

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

4

2 回答 2

2

静态函数与普通函数具有相同的类型签名;它不是真正的成员函数。

于 2013-03-02T15:24:53.253 回答
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)不是非类型模板参数的选项。

于 2013-03-02T15:25:07.233 回答