2012-01-11 19 views
2

私はEventクラスを持っています。 AddHandler(thisPtr, callback)で私はthisPtrcallbacktr1::bindを使用し、最終的に私がリストを持っている:C++イベントでハンドラを実装する方法

typedef std::tr1::function<void(int&)> CallbackFunction; 
std::list<CallbackFunction> m_handlers; 

しかしtr1::functionが非匹敵する場合どのように私は、removeハンドラメソッドを実装することができますか?

オブジェクトポインタとコールバックからのマップをtr1::functionにして、等価オブジェクトポインタとコールバックポインタを持つポインタを削除してRemoveHandlerにする必要がありますか?これは安全なアプローチですか?

+0

おそらく、あなたがすべき挿入されたオブジェクトのイテレータを返します。また、Boost.Signals2、libsigC++などをチェックしてください。 – kennytm

答えて

1

イテレータを無効にしないstd :: listを使用しているので、要素がコンテナに残っている限り、イテレータを使用して挿入する関数を追跡できます。例:今

typedef std::list<CallbackFunction> func_list; 
typedef typename func_list::iterator func_it; 
func_it Insert(func_list & l, Callback c) 
{ 
    l.insert(l.begin(), c); 
    return l.begin(); 
} 

、あなたはこのように、それを削除するために使用することができ、あなたがコールバックを挿入するために、その関数を呼び出すことができ、そしてそれにイテレータを返します。

func_it it = Insert(l, c); 
l.erase(it); 
+0

私はユーザにイテレータを保存させたくありません。 'RemoveHandler(thisPtr、memberPtr)'を指定した正しいイテレータを調べるにはどうすればよいですか? – Leo

+0

@Leo: 'std :: function'を識別できる手段が必要です。そしてあなたが知っているように、あなたは機能自体を比較することはできません。あなたは、整数のようないくつかの匹敵する値(おそらくマップ内)を持つペアで関数を格納し、その値で関数をルックアップすることができます。後で機能を識別するために、ユーザーはその値を保存する必要があります。それが受け入れられない場合、私はあなたを助ける解決策を考えることができません。 –

+0

なぜユーザは、このポインタとメンバ関数(C#のような)以外に何かを覚えていなければなりませんか?これらの2つの値を比較対象として使用できますか? – Leo

関連する問題