0

我现在有个问题。我正在尝试将 boost::signal 和 boost::bind 封装到我自己的 Event 类中。

class MyEvent
{
private:
  boost::signal<void ()> Sig;
public:
  void Subscribe(.........)
  {
    Sig.connect(boost:bind(.........);
  }

  void Raise()
  {
    Sig();
  }
};

我尝试在订阅函数的签名中传递函数指针,而 Visual Studio 只是给了我一些错误提示。我不知道如何编写订阅的签名以及传递给 boost::bind 的内容,理想情况下我将boost::bind(&MyClass::MyHandler, &MyClassObject)在订阅功能中拥有并在外部调用它MyEventObject.Subscribe(&MyClass::MyHandler, &MyClass)。谁能帮我填补这两个空白?

4

1 回答 1

0

你可以只做Subscribe一个模板:

#include <boost/signals2.hpp>
#include <boost/bind.hpp>
class MyEvent
{
private:
  boost::signals2::signal<void ()> Sig;
public:
  template<class SlotClass> 
  void Subscribe(void (SlotClass::*func)(), SlotClass *obj)
  {
    Sig.connect(boost::bind(func, obj));
  }
  void Raise()
  {
    Sig();
  }
};

struct Test
{
  void f()
  {}
};

int main()
{
  MyEvent myEvent;
  Test test;
  myEvent.Subscribe(&Test::f, &test); // test must outlive myEvent!
}

但是请注意,这样的包装器极大地限制了它的用户:使用 originalsignal时,他可以连接callable以各种方式创建的任何类型,而使用包装器时,他必须传递指向成员函数的指针和指向对象的指针。

于 2013-05-04T20:08:34.170 回答