从 std::function 的向量中删除一个项目
remove an item from a vector of std::function
我正在尝试用 C++ 编写观察者模式
所以我有一张地图,其中包含事件名称 -> 回调函数向量
回调函数存储在向量中
std::function<void(void *)>
所以地图看起来像
std::unordered_map<std::string, std::vector<std::function<void(void *)>>>
我可以向向量添加侦听器并接收和响应事件通知。我的问题是实施分离。
所以std::function的没法比,所以erase/remove出来了,所以想自己搜索vector,手动比较。
我发现 this question 使用 std::function::target 成功访问了底层指针,但我不能使用它,因为我正在使用 std::bind初始化回调:
std::function<void(void *)> fnCallback = std::bind(&wdog::onBark, this, std::placeholders::_1)
我只是想比较底层成员函数ptr,甚至是与成员函数关联的底层对象ptr进行比较。有什么办法吗?
我想避免将成员 fn ptr 包装在包含哈希的对象中,尽管看起来我可能不得不那样做...
当我这样做时,我 return 监听代码的标记。
我通常的模式是在广播中有一个weak_ptr<function<sig>>
,令牌是一个shared_ptr<void>
(指向存储的weak ptr)。
广播时,我先过滤死目标,再广播。目标通过简单地清除、销毁或以其他方式丢弃其令牌来取消注册。如果他们不想注销,他们实例中的令牌向量是一种合理的方式。
如果你从不广播这会导致旧的死资源不必要地闲逛,所以在 public 框架中我可能想要一些有更好保证的东西。但它是轻量级的,简单快捷。
我正在尝试用 C++ 编写观察者模式 所以我有一张地图,其中包含事件名称 -> 回调函数向量
回调函数存储在向量中
std::function<void(void *)>
所以地图看起来像
std::unordered_map<std::string, std::vector<std::function<void(void *)>>>
我可以向向量添加侦听器并接收和响应事件通知。我的问题是实施分离。
所以std::function的没法比,所以erase/remove出来了,所以想自己搜索vector,手动比较。
我发现 this question 使用 std::function::target 成功访问了底层指针,但我不能使用它,因为我正在使用 std::bind初始化回调:
std::function<void(void *)> fnCallback = std::bind(&wdog::onBark, this, std::placeholders::_1)
我只是想比较底层成员函数ptr,甚至是与成员函数关联的底层对象ptr进行比较。有什么办法吗?
我想避免将成员 fn ptr 包装在包含哈希的对象中,尽管看起来我可能不得不那样做...
当我这样做时,我 return 监听代码的标记。
我通常的模式是在广播中有一个weak_ptr<function<sig>>
,令牌是一个shared_ptr<void>
(指向存储的weak ptr)。
广播时,我先过滤死目标,再广播。目标通过简单地清除、销毁或以其他方式丢弃其令牌来取消注册。如果他们不想注销,他们实例中的令牌向量是一种合理的方式。
如果你从不广播这会导致旧的死资源不必要地闲逛,所以在 public 框架中我可能想要一些有更好保证的东西。但它是轻量级的,简单快捷。