Functor到静态成员函数和静态成员函数的类型

时间:2013-08-29 14:54:09

标签: c++ static-methods static-members functor

我试图将一个静态成员函数分配给仿函数,如下所示:

 class myClass
 {
   public: 
     static void (myClass::*fptr)();
     static void myFun()
     {

      }
 };

 (void (myClass::*)()) myClass::fptr = &myClass::myFun; // doesn't work

 int main()
 {
   myClass obj;
   myClass::fptr = &myClass::myFun;   // neither does this works
   return 0; 
 }

以上作业无效。

至少检查静态成员函数的类型(因为我不确定)我在main

中写了以下语句
myClass::fptr = &myClass::myFun;

VS2010 intellisense显示:

you can't assign a void ( * )() type to an entity of type void (myClass::*)()

我认为静态函数的类型应该是后者(void ( * )()

我也无法弄清楚如何为静态数据成员提供static functor的定义。

我将仿函数设为静态,因为我希望它独立于myClass的任何实例。

有人可以详细说明static functors的这个主题以及静态成员函数的类型(在这种情况下为什么它是void(*)())。是否有可能有一个指向静态成员函数的函数指针?

修改

我可以使用typedef

来解决这个问题
typedef void(*ptr)();
class myClass
{
 ....
 static ptr fptr;
};

ptr myClass::fptr = & myClass::myFunc;

但是为什么类型为静态成员函数void( * )()

4 个答案:

答案 0 :(得分:0)

由于该方法是静态的,您必须在函数上使用指针而不是方法上的指针:

(void (*f_pointer)()) = &myClass::myFun;

答案 1 :(得分:0)

静态成员函数的行为类似于非成员函数。例如。静态成员函数中没有this指针。写

void (MyClass::*func) () = ...

表示函数的签名看起来像

void func(MyClass* thisObj);

但由于没有其他参数,您需要使用普通语法。

使用普通函数指针:

void (*func)() = myClass::myFun;

或更好:

typedef void (*FPtr)();
FPtr func = myClass::myFun;

更好:

function<void()> func = myClass::myFun;

好于更好:

auto func = myClass::myFun;

编辑: 我只是搜索了标准但只找到了

(8.3.3/3) A pointer to member shall not point to a static member of a class (9.4), a 
member with reference type, or "cv void."

答案 2 :(得分:0)

类方法有一个隐藏参数 - 指向相应类对象的指针,因此必须在指针声明中指定类。 另一方面,静态方法没有这样的隐藏参数,因此您可以像使用常规函数一样使用它们。

此代码可以使用:

class myClass
{
  public: 
    static void (*fptr)();
    static void myFun()
    {
      }
};

void (* (myClass::fptr))()  = &myClass::myFun;

答案 3 :(得分:0)

这里有两个关键问题。

第一个是myClass::fptr作为static void (myClass::*fptr)()的声明。这是一个静态数据成员,它是一个返回void的成员函数指针。您需要一个静态数据成员,它是一个返回void的函数指针。声明应为static void (*fptr)()

另一个问题是缺少的东西。您没有为该静态数据成员定义(在内存中创建空间)。您需要一个void (*myClass::fptr)();void (*myClass::fptr)() = &myClass::myFun;

行的文件范围说明