我正在尝试使用函数参数的部分应用程序,以便可以使用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/

10-12 05:34