Tutorial :C++: Difficulty with partial application



Question:

I'm trying to use partial application of function arguments so I can use STL's find_if. Here is a sample program: (Class header and implementation is merged for brevity.)

#include <functional>  #include <iostream>  #include <vector>  #include <algorithm>  #include <iostream>    using namespace std;    struct Odp  {      int id;        Odp(int id)      {          this->id = id;      }        ~Odp()      {          cout << "Destructing Odp " << id << endl;      }  };    typedef vector<Odp*> OdpVec;    class Foo  {  public:      void loadUp()      {          vec.push_back(new Odp(0));          vec.push_back(new Odp(1));          vec.push_back(new Odp(2));      }      void printWithID(int id)      {          OdpVec::iterator iter = find_if(vec.begin(), vec.end(), bind1st(&hasID, id));          if (iter != vec.end())          {              cout << "Odp at " << *iter << " has id " << id << endl;              return;          }          cout << "No Odp with id " << id << " could be found." << endl;       }    private:      OdpVec vec;      bool hasID(int id, Odp* odp)      {          return odp->id == id;      }  };    int main()  {      Foo foo;      foo.loadUp();      foo.printWithID(1);  }  

However, this doesn't even compile. The error is:

error C2276: '&' : illegal operation on bound member function expression  

What am I doing wrong here?

UPDATE Making hasID() a free floating function results in this error:

error C2664: 'std::find_if' : cannot convert parameter 3 from 'std::binder1st<_Fn2>' to 'std::binder1st<_Fn2>'  1>          with  1>          [  1>              _Fn2=bool (__cdecl *)(int,Odp &)  1>          ]  1>          Cannot copy construct class 'std::binder1st<_Fn2>' due to ambiguous copy constructors or no available copy constructor  1>          with  1>          [  1>              _Fn2=bool (__cdecl *)(int,Odp &)  1>          ]  


Solution:1

bind_1st should be used with functors not member functions.

Functor is an object with overloaded operator().

You can use mem_fn to construct an adaptor around your member function.

In your case, since hasID makes no use of this you could have done with just using a static method. (Then you don't have to bind this as a first argument)


Solution:2

You have to make hasID a static function (or extract it from Foo at all). You want to have an ordinary function pointer in the binder, no pointer to a member function.


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »