Передача внутренней функции структуры (или класса) как функтора

Как я должен передать функцию внутри структуры как функтор? Я предполагал, что это должно работать нормально, но это не так:

#include <algorithm>
using namespace std;

struct s {
    int a[10];

    bool cmp(int i, int j) {
        // return something
    }

    void init() {
        sort(a, a + 10, cmp);
    }
};

который получает <unresolved overloaded function type>

2 ответа

Решение

Вы не можете сделать это напрямую, потому что cmp является функцией-членом, которая требует трех аргументов: i, jи невидимое, неявное this указатель.

Пройти cmp в std::sort, сделайте это статической функцией, которая не принадлежит ни одному конкретному экземпляру s и, таким образом, не имеет this указатель:

static bool cmp(int i, int j) {
    // return something
}

Если вам нужен доступ к thisможно завернуть cmp вместо простого функционального объекта:

struct cmp {
    s &self;
    cmp(s &self) : self(self) { }
    bool operator()(int i, int j) {
        // return something, using self in the place of this
    }
};

И назовите это так:

sort(a, a + 10, cmp(*this));

Пока ответ @Thomas полностью работает, вы можете даже сделать это проще, используя std::bind или лямбды, как следует:

// Using std::bind
std::sort( a, a + 10, std::bind(&s::cmp, this, _1, _2) );

// Using lambdas
std::sort( a, a + 1, [this](int i, int j) {return this->cmp( i, j );} );
Другие вопросы по тегам