2017-04-14 69 views
0

我剛剛開始學習模板,我正在通過一個示例,其中實現了TypeList,並看到了TypeList的Length方法的實現。C++模板特化和模板參數數

template <class TList> struct Length; 
template <> struct Length<NullType> 
{ 
    enum { value = 0 }; 
}; 

template <class T, class U> 
struct Length< Typelist<T, U> > 
{ 
    enum { value = 1 + Length<U>::value }; 
}; 

我的問題是,主長度模板只有1個參數(TList),但專業化有2個參數。這怎麼可能,我在其他地方看過專業化的參數數量較少

+0

專業化有兩個參數,但只定義一種類型。 – Jarod42

+0

專業化本身是一個具有兩個參數的模板,但它仍然只給出一種類型('Typelist ')用於專業化。 – cdhowie

回答

-1

第一:

template <> struct Length<NullType> 

是全特,第二:

template <class T, class U> 
struct Length< Typelist<T, U> > 

是部分特。

通過完全專業化,您可以提供專門化的確切類型。通過部分專業化,您可以允許所有符合某些限制的類型,在這種情況下,它可以創建類型:Typelist<T, U>,還必須提供兩個模板類型參數。

欲瞭解更多詳情請看這裏:

http://en.cppreference.com/w/cpp/language/template_specialization http://en.cppreference.com/w/cpp/language/partial_specialization

我的問題是,主要的長度模板只有1個參數(從TList),但專業化有2個參數。這怎麼可能,

這就是模板參數列表必須不同的部分是什麼讓專業化,(詳見上面的鏈接),但作爲主要的模板期望他們必須提供相同數量的類型參數(Length< Typelist<T, U> >)。

0

以下專業化爲Length專業化爲Typelist<T, U>。這對模板參數描述了顯然需要兩個參數的TypeList<T, U>。它不直接定義了Length的模板參數。

template <class T, class U> 
struct Length< Typelist<T, U> > 
{ 
    enum { value = 1 + Length<U>::value }; 
}; 

對於template <class TList> struct Length;專業化限定TList = Typelist<T, U>TU是類型。