2012-10-03 75 views
2

我在頭文件中使用模板。我使用的函數是遞歸的,我想保留函數外的兩個變量進行比較。這裏是我的代碼(注意:不能編譯):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

您可以讓整個班級成爲模板化的班級,而不僅僅是功能。

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; 
}; 
+0

這會影響呼叫站點(類型扣除將不再發生)。另外,它不是必需的(請參閱我的答案,找出隱藏實現細節的替代方案) – sehe

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); 
    } 
};