C ++:部分应用困难

时间:2010-07-09 18:08:40

标签: c++ stl functional-programming

我正在尝试使用函数参数的部分应用,因此我可以使用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>          ]

2 个答案:

答案 0 :(得分:4)

bind_1st应与functors非成员函数一起使用。

Functor是一个重载operator()的对象。

您可以使用mem_fn围绕您的成员函数构建适配器。

在您的情况下,由于hasID不使用this,您可以使用静态方法完成。 (那么你不必将this绑定为第一个参数)

答案 1 :(得分:0)

您必须使hasID成为static函数(或者从Foo中提取它)。您希望在活页夹中有一个普通的函数指针,没有指向成员函数的指针