指向成员函数的函数指针

Function pointer pointing to member function

我在创建一个普通的旧函数指针并将其分配给来自 myclass object obj[=24 的成员函数时遇到问题=].我在下面复制了一个示例,

class myclass
{
public:
myclass() { i = 38; }
int i;
void func() { cout << "inside func" << endl;  }
};

int main()
{
    myclass obj;
    myclass *objptr = &obj;

    int myclass::*iptr1; //decl pointer to member
    iptr1 = &myclass::i; //obtain offset
    cout << obj.*iptr1 << endl; //dereference using object; use .*
    cout << objptr->*iptr1 << endl; //dereference using pointer to object; use ->* 

    int *iptr2; //decl plain old integer pointer
    iptr2 = &obj.i; //obtain address of member
    cout << *iptr2 << endl; //dereference

    void(myclass::*fptr1)(); //decl pointer to member 
    fptr1 = &myclass::func; //obatain offset
    (obj.*fptr1)(); //dereference using object; use .*
    (objptr->*fptr1)(); //dereference using pointer to object; use ->* 

    /*void(*fptr2) (); // decl plain old function pointer
   fptr2 = obj.func; //this is the exact line that doesn't compile
   (*fptr2) ();*/ //after having a pointer to the member function *func* I would like to call it like this, if possible, from this plain old pointer

   getchar();
   return 0;

}

如果取消注释这三行,我会得到以下错误

Error   C3867   'myclass::func': non-standard syntax; use '&' to create a 
pointer to member   

Error   C2440   '=': cannot convert from 'void (__thiscall myclass::* )
(void)' to 'void (__cdecl *)(void)'

如果不是这三行,我会得到预期的输出

38
38
38
inside func
inside func

我需要使用普通的旧函数指针而不是指向 class 成员函数的指针来获取 func 中的第三个 。需要一些帮助。我在这里缺少语法吗?!

func 是一个非静态成员函数。它需要一个 myclass 对象来操作(函数内部 this 将指向的对象)。这就好像函数有一个不可见的 myclass 参数。

fptr2 是一个没有任何参数的函数的函数指针,因此赋值被拒绝。以下是一些替代解决方案:

  • 使 func 静态。
  • fptr2 的类型更改为指向成员的指针。
  • 不要使用原始函数指针;切换到 C++11 lambdas and/or std::function.

这是后者的一个例子:

std::function<void()> f2;
f2 = [&]{ obj.func(); };
f2();