C ++ тип функтора, возвращаемого связыванием

0

В настоящее время я программирую шахматную программу в 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)); Но какой тип должен иметь этот член или какой правильный способ его разработки?

Теги:
functional-programming
function

2 ответа

3

Я предполагаю, что вы используете С++ 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.

0

Из моего опыта работы с boost.bind (на котором основывается std-привязка), они не имеют большого значения для фиксации результатов раньше времени. Как отмечено выше, тип довольно нечетный и существует только во время компиляции.

И это часть точки. Большая часть работы за привязкой выполняется во время компиляции. Инициализация класса тривиальна, как и функция, вызывающая при использовании bind.

По моему опыту, магия привязки выполняется с помощью шаблонов во время компиляции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню