我正在尝试使用函数参数的部分应用,因此我可以使用STL的find_if
。这是一个示例程序:(为简洁起见,合并了类头和实现。)
#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);
}
然而,这甚至都没有编译。错误是:
error C2276: '&' : illegal operation on bound member function expression
我在这里做错了什么?
更新使hasID()
自由浮动功能会导致此错误:
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> ]
答案 0 :(得分:4)
bind_1st应与functors
非成员函数一起使用。
Functor是一个重载operator()的对象。
您可以使用mem_fn围绕您的成员函数构建适配器。
在您的情况下,由于hasID不使用this
,您可以使用静态方法完成。 (那么你不必将this
绑定为第一个参数)
答案 1 :(得分:0)
您必须使hasID
成为static
函数(或者从Foo
中提取它)。您希望在活页夹中有一个普通的函数指针,没有指向成员函数的指针。