Инкапсуляция boost::signal и boost::bind

У меня сейчас проблема. Я пытаюсь инкапсулировать 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, в идеале у меня будет boost::bind(&MyClass::MyHandler, &MyClassObject) в функции подписки и будет вызывать его снаружи, как MyEventObject.Subscribe(&MyClass::MyHandler, &MyClass), Могут ли люди помочь мне заполнить эти два пробела?

1 ответ

Вы можете просто сделать 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 любого вида, созданного различными способами, в то время как с вашей оберткой он должен передать указатель на функцию-член и указатель на объект.

Другие вопросы по тегам