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

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

#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));
6

Другие решения

Пока ответ @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 );} );
2

По вопросам рекламы [email protected]