2016-09-22 57 views
2

我试图写在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,虽然它看起来像我可能会走那条路......

+2

你能发表一个关于如何添加/删除地图项目的例子吗? – Holt

+0

在我看来,你已经知道答案了...... :-) – skypjack

+1

如果没有存储指向有问题的对象的指针以用作关键字,则无法真正做到这一点。我的impl使用weak_ptr并在分派事件之前检查集合以移除expired()。 Attach是(shared_from_this(),&class :: member),detach是(shared_from_this())。 – Robinson

回答

2

当我这样做,我返回一个标记到聆听代码。

我通常的模式是在广播公司有一个weak_ptr<function<sig>>,令牌是shared_ptr<void>(对于存储的弱ptr)。

广播时,我过滤出死目标,然后广播。目标通过简单地清除,销毁或以其他方式丢弃他们的令牌来注销。如果他们想永不注销,那么在他们的实例中的一个令牌向量是一种合理的方式。

如果你从未广播过,可能会导致老旧的资源不必要地挂在身边,所以在公共框架中,我可能想要一些有保证的东西。但它轻巧便捷,反之亦然。

+0

请问您可以发表一个什么样的代码来说明上面的内容吗? –

+0

@segme http://stackoverflow.com/a/34400239/1774667是SO上的前一个草图。我不知道这是否是我公布的最好的,但它应该给你的想法。 – Yakk

相关问题