2013-08-01 43 views
4

沒有參數的模板類是什麼意思?例如,我們來看一個計算階乘的模板類,其模板參數爲N - N!模板類沒有參數,`template <>`是什麼意思?

基本上,這是類:

template <int N> class Factorial 
{ 
public: 
    enum {fact = N * Factorial<N-1>::fact}; 
}; 

但是,我發現,這個類有一個「extention類」,

template<> class Factorial<1> 
{ 
public: 
    enum {fact = 1}; 
}; 

在這裏,我的問題是:什麼是模板沒有參數,template<>是什麼意思?

在此先感謝。

+2

這是模板專業化 – aaronman

+1

@aaronman:這是模板*全*專業化。 ;-) – Nawaz

+0

可能重複[在C++中是什麼模板<>是什麼意思?](http://stackoverflow.com/questions/4872809/in-c-what-does-template-mean) – user93353

回答

10

template<> class Factorial<1> 
{ 
public: 
    enum {fact = 1}; 
}; 

實際上是類模板Factorial模板專業化明確的專業化。還有一種叫的模板部分專業化。兩者都是template specialization的形式。

模板特殊化是一種特殊情況,其中當使用模板特化指示的參數實例化模板時,將使用該特定模板特化,而不是原始模板。

在你的代碼,原來Factorial模板類當實例

template <int N> class Factorial 
{ 
public: 
    enum {fact = N * Factorial<N-1>::fact}; 
}; 

使用,例如,以下內容:

  • Factorial<3>
  • Factorial<5>
  • Factorial<42>

但是當你實例/使用

Factorial<1> 

模板專業化Factorial<1>代替。換句話說,無論何時您提供1作爲模板參數,都會使用這種特殊情況。

模板專業化的一個值得注意的例子是std::vector<bool>,雖然you must be careful whether to use it or not

Also an example。該節目對類模板和功能模板都有一些最小化的模板專業化使用。

+2

+1但我在技術上說它首先:) – aaronman

+0

你是什麼意思的「模板專業化」? – Billie

+0

@aaronman你應該回答一個答案。 :) –