在C ++中传递非静态成员函数指针

时间:2012-10-01 10:35:30

标签: c++

  

可能重复:
  function pointer for a member function

我必须在C ++中提出类似下面的内容。

我在下面的课程中有一个成员函数。

class myClass {
public:
       void myFunc();

};

我在另一个库中有以下函数,我应该调用它并传递一个回调函数,它是对象的myFunc()

void AnotherFunction((void*)(pCallback)())
{
   // Here I will call back function
}

我怎样才能实现上述目标?我知道一个类的静态函数来传递回调,但在这里我必须确保函数是线程安全的。如果不使用静态,我怎样才能达到这个要求?

2 个答案:

答案 0 :(得分:4)

目前,“最佳”解决方案是呕吐异常。

void f(void(*fp)()) { fp(); }
void mah_func() { 
    try { 
        throw; 
    } catch(my_class* m) {
        m->func();
    }
}
int main() {
    my_class m;
    try {
        throw &m;
    } catch(my_class* p) {
        f(mah_func);
    }
}

这是一种恶心的滥用,但是线程安全且最便携。

答案 1 :(得分:-1)

在内部,成员函数总是将this-pointer作为“不可见”的第一个参数,因此你的函数将具有签名void(myClass *)。如果您可以将AnotherFunction的签名更改为void AnotherFunction(std::function<void()> callback),则可以执行以下操作:

#include <functional>
#include <iostream>

void AnotherFunction(std::function<void()> callback)
{
  callback();
}

void fun()
{
  std::cout << "fun()" << std::endl;
}

class Foo
{
public:
  Foo(int i) : i_(i) { }

  static void gun()
  {
    std::cout << "Foo::gun()" << std::endl;
  }

  void hun()
  {
    std::cout << "Foo(" << i_ << ")::hun()" << std::endl;
  }

protected:
private:
  int i_;
};

int main()
{
  Foo foo(666);
  AnotherFunction(fun);
  AnotherFunction(Foo::gun);
  AnotherFunction(std::bind(&Foo::hun, foo));
}

打印:

fun()
Foo::gun()
Foo(666)::hun()