2

ヘッダー ファイルでテンプレートを使用しています。私が使用している関数は再帰的であり、2 つの変数を関数の外に置いて比較したいと考えています。これが私のコードです(注:コンパイルしません):

#include "Position.h"
#ifndef _SOLVER_H
#define _SOLVER_H

class Solver{
  public:
    template<typename T>
    int EvaluatePosition(T &p, bool me) {
        int score = 0;
        if(p.isGameOver()) {
            return p.score(me);
        }
        else {
            std::vector<T> nextMoves = p.getNextPositions();
            for(int i=0; i != nextMoves.size(); i++) {
                score += EvaluatePosition(nextMoves[i],!me);
                if(score > maxScore) {
                    p.display();
                    maxScore = score;
                    maxP = p;
                    p.display();
                }
            }
            return score;
        }
    }

    T maxP; // Want this to be the same Type T that is used in the function
    int maxScore;
};

#endif

T一部のデータを保存できるように、関数で使用されているのと同じジェネリック型の変数を作成しようとしています。これは可能ですか?可能であれば、どのように行うのでしょうか?

4

2 に答える 2

2

関数だけでなく、クラス全体をテンプレート化できます。

template< class T > class Solver{
    //here goes your function that takes the argument of T class
    int EvaluatePosition(T &p, bool me){
        //...
    }

    T maxP; //here goes your variable
    int maxScore;
};
于 2012-10-03T09:25:17.563 に答える
0

もちろん、クラス全体をテンプレート化することもできます。その呼び出しインターフェイスが気に入らないと仮定すると、ローカル テンプレート クラスを使用して状態を保持できます。

class Solver{
  public:
    template<typename T> int EvaluatePosition(T &p, bool me)
    {
        struct Helper {
            T maxP;
            int maxScore;

            int DoEval(T &p, bool me)
            {
                int score = 0;
                if(p.isGameOver()){
                    return p.score(me);
                }
                else{
                    std::vector<T> nextMoves = p.getNextPositions();
                    for(int i=0; i != nextMoves.size(); i++){
                        score += DoEval(nextMoves[i],!me);
                        if(score > maxScore){
                            p.display();
                            maxScore = score;
                            maxP = p;
                            p.display();
                        }
                    }
                    return score;
                }
            }
        } helper;

        return helper.DoEval(p, me);
    }
};
于 2012-10-03T09:29:20.570 に答える