8

std::tr1::function<>どういうわけか2つのオブジェクトを比較することは可能ですか? オブジェクトのコレクションがfunction<void(int,float)>あり、イベント ハンドラーを追加および削除したい場合はどうすればよいですか? 追加は簡単ですが、削除するものを見つけるのは不可能のようです。

4

2 に答える 2

8

簡単に言えば、できません。std::function( と を含むすべての反復でboost::function)std::tr1::functionはサポートしていませんoperator==

于 2011-05-01T07:19:40.410 に答える
5

次のリンクの Stack Overflow からの情報に基づいて、それは可能ですが、独自のクラスで std::function オブジェクトをラップする場合のみです。

std::関数の std::ベクトル

ラッパー クラスを使用すると、ラップされた 2 つの std::function ポインターが等しいかどうかをテストできますが、std::function が何をラップするかについては何もわかりません。したがって、デザインを変更することはおそらくより良いアプローチです。

編集:非常によく似た問題を解決した方法を示すために戻ってきました。

0) 簡潔にするための typedef。

    using std::placeholders;
    typedef std::function < void ( int, float ) > some_func;
    typedef std::pair < intptr_t, intptr_t > method_hash;
  1. メソッドまたは関数にポインターをバインドして、std::function オブジェクトのコレクションを記述します。静的関数に対してこれを行っている場合は、some_object_ptr を省略します。

    some_func some_method ( std::bind ( some_method_ptr, 
                                        some_object_ptr, _1, _2 ) 
    
  2. std::reinterpret_cast < intptr_t > を使用して関数の一意のハッシュを作成し、それを std::pair と共に使用してメソッドに対してこれを行います。

     method_hash pairID ( reinterpret_cast < intptr_t > ( some_object_ptr ), 
                          reinterpret_cast < intptr_t > ( some_method_ptr ) );
    
  3. これで、pairID をベクターまたは他のコンテナー/配列に格納できます。ハッシュが常に正しい std::function オブジェクトに対応するようにインデックスが整列されていることを確認してください。その後、 find ( ) を使用してイテレータをその位置に取得し、 distance ( ) を使用してイテレータを必要なインデックス。

これは、コンテナが生成されるたびに実行する必要があることに注意してください。ポインターに基づいているため、ハッシュはプログラムの実行ごとに変化します。

于 2013-09-25T09:46:13.437 に答える