2016-12-25 5 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] членов шаблонов классов.