I'm trying to use partial application of function arguments so I can use STL's find_if
. Here is a sample program: (Cla开发者_如何学Goss 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> ]
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)
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.
精彩评论