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