2

std::multimapwhere values are of type がありますstd::function。の比較がないため、これstd::functionを参照してください。このマルチマップから特定の要素を削除する方法はないようです。たとえば、 aまたは などから値で要素を削除したい場合も、同じことが当てはまると思います。std::liststd::vector

私の使用例は、コールバックを引数 ( std::function) に取る関数です。特定のイベントが発生したときに、コールバックを呼び出す必要があります。ただし、呼び出し先がコールバックを起動する前に「登録解除」する必要がある場合もあります。

最初は構造体でラップし、std::functionこの構造体へのポインターをマップに挿入します。ただし、インターフェイスのユーザーがコールバックを構造体にラップしてポインター値を格納する必要がないため、これは実現可能ではありませんでした。

現時点で私が持っている最良のアイデアは、コールバックが登録されたときにIDを返すことです。これは、呼び出し先が後でコールバックをキャンセルするオプションを必要とする場合に保存する必要があります。

私のピクルスに関するアイデアはありますか?

4

1 に答える 1

0

呼び出し元が何らかのトークンを保持する必要がある場合 (idあなたの場合)、std::functionを astd::shared_ptrでラップして、作成された ID の代わりに呼び出し元がそれを提供/保持できるようにしないのはなぜですか? は、 の代わりに をその値として直接std::multimap格納します。std::shared_ptr<std::function<...>>std::function

そうすれば、後で簡単に削除でき、コストがかかる可能性のある操作std::functionである可能性がある自体をコピーする必要がありません。発信者が使用する場合、それは実際の代替IMHOになる可能性があります。std::make_shared<std::function<...>>(...)

于 2013-03-17T11:43:48.573 に答える