C ++: трудности с частичным применением - PullRequest
2 голосов
/ 09 июля 2010

Я пытаюсь использовать частичное применение аргументов функции, чтобы я мог использовать 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 ]

4 голосов
/ 09 июля 2010

bind_1st следует использовать с functors, а не с функциями-членами.

Функтор - это объект с перегруженным оператором ().

Вы можете использовать mem_fn для создания адаптера вокруг вашей функции-члена.

В вашем случае, поскольку hasID не использует this, вы могли бы просто использовать статический метод. (Тогда вам не нужно связывать this в качестве первого аргумента)

0 голосов
/ 09 июля 2010

Вы должны сделать hasID static функцией (или извлечь ее из Foo вообще).Вы хотите иметь обычный указатель функции в связывателе, а не указатель на функцию-член .

...