2

我有一个std::multimapwhere 值的类型std::function。由于没有比较std::function- 看到这个- 似乎没有办法从这个多图中删除特定元素。例如,如果您想从例如 astd::list或中按值删除元素,我想也是如此std::vector

我的用例是一个函数,它接受一个回调参数(std::function)。发生特定事件时应调用回调。但是,在其他情况下,被调用者希望在回调触发之前“取消注册”回调。

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

我目前最好的想法是在注册回调时返回一个 id - 如果被调用者希望稍后可以选择取消回调,则必须存储该 id。

对我的泡菜有什么想法吗?

4

1 回答 1

0

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

这样,您以后可以轻松地将其删除,并且不会复制std::function自身,这也可能是一项成本高昂的操作。当调用者使用std::make_shared<std::function<...>>(...)它时,它可能是一个真正的替代恕我直言。

于 2013-03-17T11:43:48.573 回答