指向成员函数的指针,作为全局函数的参数

Pointer to member function for as argument for global function

本文关键字:函数 全局 参数 指针 成员      更新时间:2023-10-16

有这样的代码:

void foo(void (*fun_ptr)()){
}
class B{
public:
    B(){
        foo(some_fun);
    }
    void some_fun(){}
};

编译错误:

error: argument of type ‘void (B::)()’ does not match ‘void (*)()’

在这种情况下如何指向成员函数?我不能更改函数foo的声明,只能更改类B的声明!

声明B::some_fun()static,因为有一个隐式的this指针作为参数传递给成员函数。注意,将B::some_fun()设置为静态会阻止对B的非公共非静态成员的访问。

这是一个常见问题解答。

除了将成员函数包装在一个静态函数中,并以某种方式告诉它调用该方法的对象实例之外,没有其他解决方案:

struct X { void foo(); }
void take_callback(void (*fun_ptr)())
{
      fun_ptr(); // invoke callback
}
//wrap the method
X* instance = 0;
void wrap_memberfun()
{
    if (instance) instance->foo(); // delegate
}
int main()
{
      X x;
      take_callback(&X::foo); // doesn't compile
      // workaround:
      instance = &x;
      take_callback(&wrap_memberfun);
}

some_fun()是一个成员函数,需要一个对象。将some_fun()设置为静态。

static void some_fun() {};

调用非静态成员函数需要两个指针(函数和类实例),因此在期望指针指向函数的地方不能真正使用指向非静态成员的指针。