【问题标题】:Functor to static member functions and type of static member function静态成员函数的函子和静态成员函数的类型
【发布时间】:2013-08-29 14:54:09
【问题描述】:

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

 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( * )()

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我不明白。但是为什么类型是这样的呢?
    • 一个(常规)方法有一个隐式参数(this)。静态方法不是这样。
    【解决方案2】:

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

    此代码将起作用:

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

    【讨论】:

      【解决方案3】:

      这里有两个关键问题。

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

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

      【讨论】:

        【解决方案4】:

        静态成员函数的行为类似于非成员函数。例如。静态成员函数中没有 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."
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多