我试图用c ++编写一个观察者模式 所以我有一个包含eventname的地图 - >回调函数的向量
回调函数存储在矢量
中std::function<void(void *)>
所以地图看起来像
std::unordered_map<std::string, std::vector<std::function<void(void *)>>>
我可以向向量添加侦听器并接收和响应事件通知。我的问题在于实施分离。
所以std :: function不能被比较,所以擦除/删除就没了,所以我想搜索向量并手动比较。
我发现this question使用std :: function :: target成功获取对底层指针的访问权限,但我不能使用它,因为我使用std :: bind来初始化回调:
std::function<void(void *)> fnCallback = std::bind(&wdog::onBark, this, std::placeholders::_1)
我只想比较底层成员函数ptrs,甚至比较与成员函数关联的底层对象ptr。有什么办法吗?
我想避免将成员fn ptr包装在包含哈希的对象中,尽管看起来我可能不得不这样做...
答案 0 :(得分:2)
当我这样做时,我会将一个令牌返回给收听代码。
我通常的模式是在广播公司中有一个weak_ptr<function<sig>>
,而令牌是shared_ptr<void>
(对于存储的弱ptr)。
广播时,我会过滤死目标,然后广播。目标通过简单地清除,销毁或以其他方式丢弃其令牌来取消注册。如果他们想要永远取消注册,那么他们实例中的标记向量是一种合理的方式。
如果你从未广播这可能导致旧的死资源不必要地悬挂在周围,所以在公共框架中我可能想要更好的保证。但它轻巧而快速。