C ++ boost :: bind和boost :: function,类成员函数回调和operator ==。我究竟做错了什么?

时间:2010-12-08 09:50:19

标签: function boost callback bind

我在使用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的参数需要完全指定(具体值)但这是我无法在我正在开发的代码中得到的东西,我只需要知道传递的处理程序是否是是否注册,因为我绑定了一个对象,它应该拥有所有必要的信息来区分。

1 个答案:

答案 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“包裹”。