封装boost :: signal和boost :: bind

时间:2013-05-01 21:06:29

标签: c++ boost boost-bind boost-signals

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

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

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

我试图在订阅功能的签名中传递函数指针,而visual studio只是给我错误的音调。 我不知道如何编写Subscribe的签名和什么传递给boost :: bind,理想情况下我会在Subscribe函数中有boost::bind(&MyClass::MyHandler, &MyClassObject),并会像MyEventObject.Subscribe(&MyClass::MyHandler, &MyClass)一样在外面调用它。 任何人都可以帮助我填补这两个空白吗?

1 个答案:

答案 0 :(得分: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!
}

但请注意,这样的包装器非常限制其用户:使用原始signal,他可以连接以各种方式创建的任何类型的callable,而使用包装器时,他必须将指针传递给成员函数和指向对象的指针。

相关问题