从std :: function的向量中删除一个项目

时间:2016-09-22 08:09:30

标签: c++ c++11 vector std-function

我试图用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包装在包含哈希的对象中,尽管看起来我可能不得不这样做...

1 个答案:

答案 0 :(得分:2)

当我这样做时,我会将一个令牌返回给收听代码。

我通常的模式是在广播公司中有一个weak_ptr<function<sig>>,而令牌是shared_ptr<void>(对于存储的弱ptr)。

广播时,我会过滤死目标,然后广播。目标通过简单地清除,销毁或以其他方式丢弃其令牌来取消注册。如果他们想要永远取消注册,那么他们实例中的标记向量是一种合理的方式。

如果你从未广播这可能导致旧的死资源不必要地悬挂在周围,所以在公共框架中我可能想要更好的保证。但它轻巧而快速。