2010-12-08 77 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常見問題解答: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; 
     } 
    } 
} 

這裏,oldFunc得到保留其實際類型沒有在boost::function被「包裹」。

+0

謝謝,這解決了這個問題,我得到它的工作原理。我只是不會想到它自己。猜猜我還有更多的方法來學習C++。 – Max021 2010-12-08 12:29:32

相關問題