Я пишу проект на C ++ и у меня есть общий метод оценки в шаблоне класса.
Мой единственный вопрос: как бы я определил generateAllMoves
и isPosFinal
, чтобы он определялся внутриклассы, которые используют этот шаблон класса?
Я читал, что использование чисто виртуальных функций - нет, нет.Я также не хочу делать это статичным.
Я предвижу, что переписываю это как абстрактный класс, но тогда я бы столкнулся с проблемой, которая требует универсальных типов.: Чтобы быть более понятным для всех!
У меня есть две разные игры, которые определяют свои собственные методы generateAllMoves и isPosFinal.Они используют разные алгоритмы и возвращают разные типы .... Например, я скоро буду реализовывать игру в шахматы, но сейчас я реализую nim.Оба интерпретируют ход, и эта позиция является окончательной, по-разному.
2nd Edit:
Финальный код компилируется!
#ifndef ENGINE_H
#define ENGINE_H
#include <map>
using namespace std;
template< typename Derived, class M, class P >
class Engine {
public:
struct Move {
P move;
P pos;
int score;
};
Move evaluate( P position ) {
Move best;
if ( static_cast<Derived*>(this)->posIsFinal( position ) ) {
Move newMove;
newMove.pos = position;
newMove.score = 1;
return newMove;
}
else {
map< M , P > allMoves = static_cast<Derived*>(this)->generateAllMoves( position );
typename map< M , P > :: iterator it;
for (it = allMoves.begin(); it != allMoves.end(); it++ ) {
Move next = evaluate(it->second);
if (next.score > best.score ) {
best.pos = next.pos;
best.move = next.move;
best.score = next.score;
}
}
return best;
}
}
bool posIsFinal( P position ) {
cerr << "Generic posIsFinal\n";
exit(1);
}
map< M , P > generateAllMoves( P position ) {
cerr << "Generic generateAllMoves\n";
exit(1);
}
private:
};
#endif