从std::function的vector对象中移除一个元素

remove an item from a vector of std::function

本文关键字:一个 元素 function std vector 对象      更新时间:2023-10-16

我试图在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)。

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

如果你从不广播,这可能会导致旧的死资源不必要地徘徊,所以在公共框架中,我可能希望有更好的保证。但它是轻量级的,简单快捷。