2016-12-25 7 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]の形で定数式を使用する必要があります。

関連する問題