Функтор - это объект , который ведет себя как функция.
Это означает, что вам нужно определить класс, который определяет оператор ()
Пример:
class GameBoardMoveListSorter
{
bool operator()(std::pair<unsigned, unsigned> const& left,
std::pair<unsigned, unsigned> const& right) const
{
return left.first < right.first; // or whatever your strict weak ordering is.
}
};
/// STUFF
moveList.sort(GameBoardMoveListSorter());
Редактировать на основе комментариев:
Комментарии от других, пожалуйста:
Хотя новый стандарт предоставил доступ к внутренним классам закрытым членам включающих классов. Но только что перечитал стандарт, который, кажется, не соответствует формулировке, которую я вижу (поведение компилятора, по-видимому, допускает доступ (хотя я знаю, что соответствие в этой области всегда было слабым)).
Раздел 9.7 Пункт 4
Как и функция-член, функция друга (11.4), определенная во вложенном классе, находится в лексической области этого класса; он подчиняется тем же правилам привязки имен, что и статическая функция-член этого класса (9.4), , но не имеет специальных прав доступа к членам включающего класса .
На основании приведенного выше раздела руководства. Внутренний класс должен быть дружественным классом для доступа к закрытым членам внешнего класса.
Примечание. В отличие от java, между внутренним и внешним классом нет подразумеваемых родительских отношений. Таким образом, внутренний класс должен иметь явную ссылку на объект внешнего класса для доступа к его членам.
#include <memory>
class Chess
{
private:
int board[8][8];
class GameBoardMoveListSorter
{
GameBoardMoveListSorter(Chess& p)
: parent(p)
{}
bool operator()(std::pair<unsigned, unsigned> const& left,
std::pair<unsigned, unsigned> const& right) const
{
int val = parent.board[0][0] + parent.board[7][7];
return left.first + val < right.first - val; // or whatever your strict weak ordering is.
}
Chess& parent;
};
// I believe that it must be a friend to access private members.
friend class GameBoardMoveListSorter;
public:
void makeMove()
{
std::list<std::pair<unsigned, unsigned> > moveList(/*Generate Moves*/);
moveList.sort(GameBoardMoveListSorter(*this));
// Do something with the move list.
}
};