C ++头文件模板

时间:2012-10-03 09:23:39

标签: c++

我在头文件中使用模板。我正在使用的函数是递归的,我想在函数之外保留两个变量来进行比较。这是我的代码(注意:不编译):

#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相同的泛型类型的变量,以便我可以保存一些数据。这是可能的,如果是的话,会怎么做?

2 个答案:

答案 0 :(得分: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;
};

答案 1 :(得分: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);
    }
};