2014-10-11 2 views
0

В настоящее время я программирую шахматную программу на C++. Алгоритм поиска - alphaBeta, поэтому я сортирую ходы перед тем, как проходить через них и оценивать их. Мой основной класс - это позиция класса, которая выполняет весь поиск, а также содержит функцию сравнения двух перемещений.C++ Тип функтора, возвращаемого связыванием

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

ответ

3

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

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

Смежные вопросы