我遇到了使用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