从std::function的vector对象中移除一个元素
remove an item from a vector of std::function
我试图在c++中编写一个观察者模式所以我有一个映射包含eventname ->回调函数向量
回调函数以
形式存储在vector容器中std::function<void(void *)>
所以地图看起来像
std::unordered_map<std::string, std::vector<std::function<void(void *)>>>
我可以向向量添加侦听器,并接收和响应事件通知。我的问题是实现分离。
所以std::函数不能比较,所以erase/remove是out的,所以我想搜索向量并手动比较。
我发现这个问题已经成功使用std::function::target访问底层指针,但我不能使用这个,因为我使用std::bind来初始化回调:
std::function<void(void *)> fnCallback = std::bind(&wdog::onBark, this, std::placeholders::_1)
我只想比较底层成员函数ptrs,或者甚至比较与成员函数相关联的底层对象ptr。有办法吗?
我希望避免将成员fn ptr包装在包含散列的对象中,尽管看起来我可能不得不这样做…
当我这样做时,我返回一个令牌给侦听代码。
我通常的模式是在广播中有一个weak_ptr<function<sig>>
,令牌是一个shared_ptr<void>
(到存储的弱ptr)。
广播时,我过滤掉死目标,然后广播。目标只需清除、销毁或以其他方式丢弃其令牌即可注销。如果他们想永远不注销,那么在他们的实例中使用令牌向量是一种合理的方式。
如果你从不广播,这可能会导致旧的死资源不必要地徘徊,所以在公共框架中,我可能希望有更好的保证。但它是轻量级的,简单快捷。
相关文章:
- lower_bound()返回最后一个元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- 选择一个元素而不是一个对象的数组的原因
- std::矢量保存 只推送最后一个元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 访问 for_each 函数中的前一个元素
- 在 QListView 中显示最后一个元素
- 从 std::vector 中选择一个元素,而不是给定元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何从一个无序集合中获取一个元素