2017-01-05 3 views
7

Verwandte Fragen:Klasse Template Spezialisierung mit Template-Klasse

Betrachten Sie den folgenden Code ein:

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

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

Warum ist eine solche Template-Klasse Spezialisierung Syntax korrekt? Die folgende scheint logisch:

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

die zweite ist überhaupt nicht logisch. 'template <>' bedeutet, dass Sie sich eindeutig nur für eine Art von 'T' spezialisieren. Was Sie tun, ist eine teilweise Spezialisierung (Sie geben eine unendliche Teilmenge von T an. D. H. Nur diejenigen, die die Form 'std :: vector ' erfüllen) –

Antwort

0

Vorlage Klasse Teil Spezialisierung Syntax Funktions-Template Syntax eng spiegelt. Tatsächlich basieren die Regeln zum Anordnen von Klassenschablonen-Teilspezialisierungen auf der partiellen Anordnung von Funktionsschablonen.

Die Art und Weise Sie eine Funktion schreiben, würde eine vector<T> nehmen ist:

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

So wie Sie eine Spezialisierung auf vector<T> schreiben ist das gleiche:

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

die Spezialisierung der is_std_vector Matching versuchen würde, T in vector<T> von einem Typ Argument A abzuleiten, so macht es viel Sinn, dass sie auf die gleiche Weise geschrieben werden.

Für vollständige Spezialisierungen verwenden wir template <> als Platzhalter-Signal, damit vollständige Spezialisierungen Teilspezialisierungen ähnlich sehen. Ich bin mir nicht sicher, welchen Zweck ein extra template <> in diesem speziellen Fall dienen würde.

Verwandte Themen