我正在尝试使用函数参数的部分应用程序,以便可以使用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
我在这里做错了什么?
UPDATE 使
hasID()
为自由 float 函数会导致以下错误: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应该与functors
一起使用,而不是成员函数。
Functor是一个带有重载operator()的对象。
您可以使用mem_fn在您的成员函数周围构造一个适配器。
在您的情况下,由于hasID不使用this
,因此仅使用静态方法就可以完成。 (然后,您不必将this
绑定(bind)为第一个参数)
关于c++ - C++:难以部分应用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3215362/