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 回答