我现在有问题。我正在尝试将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)
一样在外面调用它。
任何人都可以帮助我填补这两个空白吗?
答案 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
,而使用包装器时,他必须将指针传递给成员函数和指向对象的指针。