1

可能重复:
成员函数的函数指针

我必须在 C++ 中想出一些类似下面的东西。

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

class myClass {
public:
       void myFunc();

};

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

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

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

4

2 回答 2

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);
    }
}

这是一种令人作呕的滥用,但线程安全且最便携。

于 2012-10-01T10:39:30.417 回答
-1

在内部,成员函数始终将 this 指针作为“不可见”的第一个参数,因此您的函数将具有签名 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()
于 2012-10-01T10:53:11.110 回答