2016-12-25 71 views
0

我是C++模板的初學者。我正在嘗試使用模板來計算階乘,並附上下面的代碼。我想用模板專業化來取代if(t == 0)部分,但我們現在還沒有做到這一點。請幫助
的#include固定值的模板專業化

template <class T> 
    class Factorial 
    { 
     public: 
      T factorial(T t) 
      { 
       if(t==0) 
        return 1; 
       fact[t] = t*factorial(t-1); 
       std::cout<<"t and fact[t] "<<t<<", "<<fact[t]<<std::endl; 
       return fact[t]; 
      } 

      void Print(T t) 
      { 
       std::cout<<"fact["<<t<<"] = "<<fact[t]<<std::endl; 
      } 

     private: 
      T fact[100]; 
    }; 

    /* 
    std::constexpr bool isZero(int x) 
    { 
     if(x==0) 
      return true; 
    } 
    */ 

    template<> 
    class Factorial<0> 
    { 
     public: 
      int factorial(int x) 
      { 
       return 1; 

     } 

      void Print(int t) 
      { 
       std::cout<<"special fact["<<t<<"] = "<<1<<std::endl; 
      } 
    }; 
    int main() 
    { 
     Factorial<int> fact; 
     fact.factorial(5); 
     fact.Print(4); 

     return 0; 
    } 
+0

實際上有數千個使用遞歸模板編寫的階乘函數的例子。我建議你首先得到一個工作示例,然後看看在完成這樣的飛行之前如何完成它。 – PaulMcKenzie

回答

4

首先,你的專長是絕對錯誤的:你不能專注於一個參數與預期值的類型的模板。你可以在類型上專門化你的Factorial類模板。例如,您可以專門

template <> 
class Factorial<int> { 
    ... 
}; 

如果你想專注於價值模板你需要使主模板行程在價值觀方面,如:

template <int N> 
class Factorial { // primary template 
    ... 
}; 
template <> 
class Factorial<0> { // specialization 
    ... 
}; 

下一頁,您的計算實際上是一個運行時計算,您不能讓編譯器將運行時值的處理分配給模板特化。如果你真的想做這樣的事情,你需要以編程的方式來做。也就是說,一旦你在一個函數中,你將無法讓編譯器爲模板特化分派一個函數參數。如果你想讓編譯器調度到一個模板專門化,你需要使用常量表達式,可能是類模板成員的形式[static]。