В настоящее время я программирую шахматную программу в C++. Алгоритм поиска - alphaBeta, поэтому я сортирую ходы перед тем, как проходить через них и оценивать их. Мой основной класс - это позиция класса, которая выполняет весь поиск, а также содержит функцию сравнения двух перемещений.
class Position{
private:
//This vector holds the moves of the current line, to be evaluated
vector<Move> currentSearch(4000);
// This function uses internal fields of class Position to determine, whether move1 or move2 should be searched first
bool compare(const Move& move1, const Move& move2);
int alphaBeta(int ply, int depth, int alpha, int beta);
}
Теперь, чтобы отсортировать ходы в currentSearch, я всегда звоню в alphaBeta
sort(currentSearch.begin(), currentSearch.end(), bind(mem_fn(&Position::compare),this,_1,_2));
Итак, это генерирование функтора со bind(mem_fn(&Position::compare),this,_1,_2));
выполняется несколько раз внутри одного поиска, чтобы сгенерировать тот же самый функтор.
Я хотел бы иметь член класса Position, который инициализирован для bind(mem_fn(&Position::compare),this,_1,_2));
Но какой тип должен иметь этот член или какой правильный способ его разработки?
Я предполагаю, что вы используете С++ 11, потому что std::bind
недоступен в предыдущих выпусках.
С http://en.cppreference.com/w/cpp/utility/functional/bind:
template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
Очевидно, что стандартный комитет не хочет жестко кодировать детали реализации в стандарт.
Поэтому, если вам действительно нужно где-то хранить функтор, лучший выбор - написать собственный класс функторов вместо использования лямбда или std::bind
. Второй лучший выбор - использовать функцию std::function
. Он может хранить любую функцию, например, с совместимой подписью, но с накладными расходами, которые вам, вероятно, не нужны.
Или вы можете просто скопировать и вставить те же строки или использовать auto
если функтор повторно используется внутри одной и той же функции.
Кстати, mem_fun
не нужен, когда вы используете std::bind
.
Из моего опыта работы с boost.bind (на котором основывается std-привязка), они не имеют большого значения для фиксации результатов раньше времени. Как отмечено выше, тип довольно нечетный и существует только во время компиляции.
И это часть точки. Большая часть работы за привязкой выполняется во время компиляции. Инициализация класса тривиальна, как и функция, вызывающая при использовании bind.
По моему опыту, магия привязки выполняется с помощью шаблонов во время компиляции.