2013-03-17 80 views
2

我有一個std::multimap,其中值的類型爲std::function。由於沒有std::function的比較 - 請參見this - 似乎無法從此多圖移除特定元素。例如,如果你想要,例如,從值中刪除一個元素,我想也是一樣。 a std::liststd::vectorMultimap以std :: function作爲值

我的用例是一個函數,它需要一個回調參數(std::function)。回調應在特定事件發生時調用。但是,在被調用者希望在被解僱之前「撤銷」回調的情況下,還可能存在其他情況。

最初我雖然讓我把std::function包裝在一個結構中,並在我的地圖中插入指向這個結構的指針。然而,這並不是可行的,因爲接口用戶不必將回調包裝在結構和存儲指針值中。

我現在最好的想法是在註冊回調時返回一個id - 如果被叫方想要稍後取消回叫,則必須存儲這個id。

我的泡菜有什麼想法嗎?

+0

你的「id」建議是我會做的。 – 2013-03-17 01:02:54

+1

'std :: multimap'不會在插入/擦除時使迭代器無效,因此您可以只存儲新插入元素的迭代器,並將其用於擦除元素。即使我不知道'std :: multimap'很好,我經常使用這個方法來處理'std :: list',這就像一個魅力。由於對迭代器的約束似乎是相同的,我沒有理由爲什麼它不應該工作,除非我錯過了一些細節。 – syam 2013-03-17 01:16:21

+0

我已經結合了這兩個評論。我返回一個id,並且我返回的id是「保存」multimap中條目的迭代器。這使得刪除非常簡單的'mulitmap.erase(it)'。我還鍵入了迭代器,以便它類似於'class :: id_t'。感謝您的輸入 – 2013-03-18 09:43:16

回答

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<...>>(...)它可能是一個真正的替代恕我直言。

+0

如果您存儲shared_ptr,客戶端應該如何刪除它? – doctorlove 2013-07-05 10:01:49

+0

我不認爲這是正確的。如果一個地方共享一個指針使它成爲nullptr,那麼另一個地方仍然會有它以前的ptr視圖 - 這就是共享點,當然? – doctorlove 2013-07-05 12:09:09

+0

@doctorlove我認爲你錯過了這一點。我提出的解決辦法是解決OP詢問的最初問題(並且這樣做)。它的確存在一定的濫用潛力,但這超出了這個範圍。我的答案旨在讓OP開始克服'std :: function'缺少比較運算符的問題。 – 2013-07-05 15:10:36