2017-01-05 208 views
7

相關問題:模板類專業化與模板類

考慮下面的代碼:

template <typename T> 
    struct is_std_vector: std::false_type { }; 

    template<typename ValueType> 
    struct is_std_vector<std::vector<ValueType>>: std::true_type { }; 

爲什麼是這樣的模板類專業化的語法是否正確? 下面似乎更邏輯:

template <typename T> 
    struct is_std_vector: std::false_type { }; 

    template<> //--- because it is is_std_vector specialization 
    template<typename ValueType> 
    struct is_std_vector<std::vector<ValueType>>: std::true_type { }; 
+7

第二個根本不合邏輯。 'template <>'意味着你明確地只專注於一種'T'類型。你正在做的是部分特化(你指定了T的無限子集,即只有那些滿足'std :: vector '形式的子集) –

回答

0

類模板部分特語法密切反映功能模板的語法。實際上,排序類模板部分特化的規則是基於函數模板部分排序的。

的方式,你會寫一個函數採取vector<T>是:

template <class T> 
void is_std_vector(vector<T>) { ... } 

所以你寫上vector<T>一個專業化的方式是一樣的:

template <class T> 
class is_std_vector<vector<T>> { ... }; 

匹配is_std_vector專業化會嘗試從某些類型參數A中推導出的vector<T>,所以它們很有意義,它們是用相同的方式寫的。

對於完整的專業化,我們使用template <>作爲佔位符信號,使完全專業化看起來類似於部分專業化。我不確定在這個特殊情況下額外的template <>會有什麼用處。