我想实现一个使用boost::signal
进行回调的类。其他对象可以使用AddHandler()
和RemoveHandler()
方法注册其回调函数。
在one SO answer中建议我们跟踪从boost::signal::connection
返回的connect()
个对象,但in another建议我们不要这样做!我不清楚如何管理连接。
当我只有connection
时,我怎样才能查找哪个slot_type
断开连接?
class MyClass {
public:
typedef void Handler();
void AddHandler(const boost::signal<Handler>::slot_type& aHandler) {
mSignal.connect(aHandler);
}
void RemoveHandler(const boost::signal<Handler>::slot_type& aHandler) {
mSignal.disconnect(aHandler); // compiler error!
}
private:
boost::signal<Handler> mSignal;
};
我希望调用者能够执行以下操作:
MyObject lMyObject;
lMySignaler.AddHandler(boost::bind(&MyObject::OnEvent, lMyObject));
...
lMySignaler.RemoveHandler(boost::bind(&MyObject::OnEvent, lMyObject));
答案 0 :(得分:0)
我没有使用const boost::signal<Handler>::slot_type&
作为我的参数类型,而是将它们更改为函数指针。然后我使用函数指针作为std::map
中的键来跟踪boost::signals::connection
。调用RemoveHandler
时,我刚刚在连接上调用了disconnect
并删除了地图中的条目。