我遇到了使用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 2010-12-08 12:29:32