我试图写在C + + 所以我有一个包含事件名称的映射图的一个观察者模式中删除项目 - 回调函数>矢量从STD的一个矢量::函数
回调函数存储在矢量
std::function<void(void *)>
所以地图上看起来像
std::unordered_map<std::string, std::vector<std::function<void(void *)>>>
我可以添加监听器载体和接收和事件通知作出回应。我的问题是执行分离。因此,std :: function无法进行比较,所以我们不需要擦除/删除,所以我想搜索矢量并手动比较。
我发现this question使用std ::功能::目标与获得访问底层指针取得了成功,但由于我使用的std ::绑定初始化的回调,我不能用这个,:
std::function<void(void *)> fnCallback = std::bind(&wdog::onBark, this, std::placeholders::_1)
我只想比较底层成员函数ptrs,甚至是与成员函数关联的底层对象ptr进行比较。有什么办法吗?
我想避免包装在包含一个散列对象的成员函数PTR,虽然它看起来像我可能会走那条路......
你能发表一个关于如何添加/删除地图项目的例子吗? – Holt
在我看来,你已经知道答案了...... :-) – skypjack
如果没有存储指向有问题的对象的指针以用作关键字,则无法真正做到这一点。我的impl使用weak_ptr并在分派事件之前检查集合以移除expired()。 Attach是(shared_from_this(),&class :: member),detach是(shared_from_this())。 – Robinson