我在使用boost :: bind和boost :: function并将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中看到operator ==函数,我相信这应该可行,我似乎无法弄清楚如何。有人可以帮帮我吗?我怀疑它是失败的,因为boost :: bind的参数需要完全指定(具体值)但这是我无法在我正在开发的代码中得到的东西,我只需要知道传递的处理程序是否是是否注册,因为我绑定了一个对象,它应该拥有所有必要的信息来区分。
答案 0 :(得分: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
“包裹”。