2010-12-08 11 views
1

私はboost :: bindとboost :: functionの使用とboost :: functionを別のクラスへのコールバックとして渡すことに問題があります。C++のboost :: bindとboost :: function、クラスメンバ関数のコールバックと演算子==。私は間違って何をしていますか?

typedef boost::function<void (bool)> callbackFunction; 

class HasCallback 
{ 
public: 
HasCallback() : value(0) 
{ 
} 

int value; 

void CallBackFunction(bool changed) 
{ 
    std::cout << "HasCallback class. CallBackFunction called. Parameter: " << value << std::endl; 
} 
}; 

class ReceivesCallback 
{ 

public: 
void AddCallback(callbackFunction newFunc) 
{ 
    callbacks.push_back(newFunc); 
} 

void execute(int &i) 
{ 
    for(std::vector<callbackFunction>::iterator it = callbacks.begin(); it != callbacks.end(); it++) 
    { 
    (*it)(i++); 
    } 
} 

void RemoveHandler(callbackFunction oldFunc) 
{ 
    for(std::vector<callbackFunction>::iterator it = callbacks.begin(); it != callbacks.end(); it++) 
    { 
    if((*it) == oldFunc) 
    { 
    callbacks.erase(it); 
    break; 
    } 
    } 

} 

private: 
std::vector<callbackFunction> callbacks; 
}; 


int main() 
{ 
HasCallback hc; 
ReceivesCallback rc; 
rc.AddCallback(boost::bind(&HasCallback::CallBackFunction, &hc, _1)); 
hc.value = 123; 



HasCallback hc2; 
rc.AddCallback(boost::bind(&HasCallback::CallBackFunction, &hc2, _1)); 
hc2.value = 321; 

int a = 0; 

rc.RemoveHandler(boost::bind(&HasCallback::CallBackFunction, &hc2, _1)); 
rc.execute(a); 
} 

私がいる問題は、これはコンパイルすらしないということである。

は、ここで問題となる状況である例です。 if((* it)== oldFunc)行のReceivesCallback :: RemoveHandlerの中で、私がしようとしているものに対して演算子==の複数のオーバーロードがあるというエラーを返して失敗します。 私はこれを探し続けて、私が間違っていることを見つけることができません。また、私は矛盾した情報を見つけ続けています。一つは、boost :: function-sとそれ以外のことを比較することができるということです。 boost/function_base.hpp内の演算子==関数を見ることができます。これはうまくいくと思いますが、どうやって計算するのか分かりません。誰かがここで私を助けることができますか? boost :: bindのパラメータが完全に(具体的な値に)指定される必要があるので、私の疑惑は失敗しますが、これは私が開発しているコードでは得られないものです、渡されたハンドラが登録されているかどうか、私はオブジェクトにバインドしているので、区別するために必要なすべての情報が必要です。

答えて

1

説明のためにBoost.Function FAQを参照してください:Why can't I compare boost::function objects with operator== or operator!= ?

Boost.Functionsは、boost::functionと任意の関数オブジェクトの比較のみを提供します。私はあなたのRemoveHandlerメンバ関数テンプレートを作成しても問題が解決できると信じている:ここで

template<class Functor> 
void RemoveHandler(const Functor &oldFunc) 
{ 
    for(std::vector<callbackFunction>::iterator it = callbacks.begin(); it != callbacks.end(); it++) 
    { 
     if((*it) == oldFunc) 
     { 
      callbacks.erase(it); 
      break; 
     } 
    } 
} 

oldFuncboost::functionに「ラップ」されることなく、その実際の型を保つために取得します。

+0

これは問題を解決し、どのように動作するかを確認します。私は決して自分自身を考えなかったでしょう。私はまだC++でもっと学ぶ方法があると思います。 – Max021

関連する問題