Инкапсуляция 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),
Могут ли люди помочь мне заполнить эти два пробела?

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

0

Другие решения

Других решений пока нет …