私は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のパラメータが完全に(具体的な値に)指定される必要があるので、私の疑惑は失敗しますが、これは私が開発しているコードでは得られないものです、渡されたハンドラが登録されているかどうか、私はオブジェクトにバインドしているので、区別するために必要なすべての情報が必要です。
これは問題を解決し、どのように動作するかを確認します。私は決して自分自身を考えなかったでしょう。私はまだC++でもっと学ぶ方法があると思います。 – Max021