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

sta*_*ser 6 c++ vector c++11 std-function

我正在尝试用 C++ 编写观察者模式,因此我有一个包含 eventname -> 回调函数向量的映射

回调函数存储在向量中,如下所示

std::function<void(void *)>
Run Code Online (Sandbox Code Playgroud)

所以地图看起来像

std::unordered_map<std::string, std::vector<std::function<void(void *)>>>
Run Code Online (Sandbox Code Playgroud)

我可以向向量添加侦听器并接收和响应事件通知。我的问题是实施分离。

所以 std::function 无法比较,因此擦除/删除已不再适用,所以我想搜索向量并手动比较。

我发现这个问题使用 std::function::target 成功地访问了底层指针,但我不能使用它,因为我使用 std::bind 来初始化回调:

std::function<void(void *)> fnCallback = std::bind(&wdog::onBark, this, std::placeholders::_1)
Run Code Online (Sandbox Code Playgroud)

我只想比较底层成员函数 ptr,甚至与该成员函数关联的底层对象 ptr 进行比较。有什么办法吗?

我想避免将成员 fn ptr 包装在包含哈希的对象中,尽管看起来我可能必须这样做......

Yak*_*ont 2

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

我通常的模式是在广播者中有一个weak_ptr<function<sig>>,并且令牌是a shared_ptr<void>(到存储的weak ptr)。

广播时,我过滤掉死目标,然后广播。目标只需清除、销毁或以其他方式丢弃其令牌即可取消注册。如果他们不想注销,则实例中的令牌向量是一种合理的方式。

如果你从不广播这可能会导致旧的死资源不必要地闲置,所以在公共框架中我可能想要一些有更好保证的东西。但除此之外,它是轻量级的、简单且快速的。