2010-12-08 81 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

相关问题