从 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 框架中我可能想要一些有更好保证的东西。但它是轻量级的,简单快捷。