2017-01-05 9 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

第2のものはまったく論理的ではありません。 'template <> 'は、あなたが一種の' T'だけを専門にしていることを意味します。あなたがやっていることは、部分的な特殊化です(Tの無限サブセット、すなわち 'std :: vector 'の形式を満たすものだけを指定しています) –

答えて

0

クラステンプレート部分的な特殊構文は密接関数テンプレートの構文を反映しています。実際に、クラステンプレートの部分的な特殊化を注文する規則は、関数テンプレートの部分的な順序付けに基づいています。

あなたがvector<T>を取る関数を書くような方法がある:

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

ですから、vector<T>に特化を書く方法は同じです。is_std_vectorの専門のマッチング

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

をしようとするだろうをの型引数Aから推測すると、同じように書かれていることは非常に意味があります。

フルスペシャリゼーションでは、完全修飾を部分スペシャリゼーションに似せるようにプレースホルダシグナルとしてtemplate <>を使用します。私はこの特別なケースでは何のために特別なtemplate <>が役立つのかわからない。

関連する問題