我在头文件中使用模板。我正在使用的函数是递归的,我想在函数之外保留两个变量来进行比较。这是我的代码(注意:不编译):
#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
相同的泛型类型的变量,以便我可以保存一些数据。这是可能的,如果是的话,会怎么做?
答案 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);
}
};