模板函数参数和模板成员函数参数

时间:2013-03-02 15:20:53

标签: c++ templates

我有这个问题:

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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)不是非类型模板参数的选项。