使用std :: function作为值的Multimap

时间:2013-03-17 00:19:17

标签: c++ c++11

我有一个std::multimap,其值为std::function。由于std::function没有比较 - 请参阅this - 似乎无法从此多重图中删除特定元素。我想如果您愿意,例如,按照例如从值中移除元素,也是如此。 std::liststd::vector

我的用例是一个将回调作为参数(std::function)的函数。应在特定事件发生时调用回调。但是,可能存在其他情况,被调用者想要在回调之前“取消注册”回调。

最初,我只是将std::function包装在一个结构中,并在我的地图中插入指向此结构的指针。但是,这并不可行,因为接口用户不必在结构中包装回调并存储指针值。

我现在最好的想法是在注册回调时返回一个id - 如果被叫方想要稍后取消回调,则必须存储该ID。

关于我泡菜的任何想法?

1 个答案:

答案 0 :(得分:0)

如果调用者应该保留某种令牌(id在你的情况下),为什么不将std::function包裹在std::shared_ptr中并让调用者提供/保留而不是一些虚构的ID?然后,std::multimap会将std::shared_ptr<std::function<...>>直接存储为其值,而不是std::function

这样,您可以稍后轻松删除它,并且不会复制std::function本身,也可能是potentially costly operation。当呼叫者使用std::make_shared<std::function<...>>(...)时,它可能是一个真正的替代恕我直言。