2017-01-05 26 views
7

Podobne pytania:Szablon klasy specjalizacja z klasy szablon

Rozważmy następujący kod:

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

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

Dlaczego składnia specjalizacja taka klasa szablon prawidłowe? Poniższy wydaje się bardziej logiczne: szablon

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

sekunda wcale nie jest logiczna. 'template <>' oznacza, że ​​specjalizujesz się wyłącznie w jednym typie 'T'. To co robisz, to częściowa specjalizacja (określasz nieskończony podzbiór T., tj. Tylko te, które spełniają formę 'std :: vector ') –

Odpowiedz

0

Klasy częściowe składnia specjalizacja ściśle odzwierciedla składnię szablonu funkcji. Rzeczywiście, zasady zamawiania częściowych specjalizacji szablonów klas oparte są na szablonach częściowych uporządkowania szablonów.

Sposób byś napisać funkcję robienia vector<T> jest:

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

Więc sposób piszesz specjalizację na vector<T> jest taka sama:

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

dopasowując specjalizacja is_std_vector próbowałby wyprowadzić T w vector<T> z jakiegoś argumentu typu A, więc ma to wiele sensu, że są one pisane w ten sam sposób.

Dla pełnych specjalizacji używamy template <> jako sygnału zastępczego, aby pełne specjalizacje wyglądały podobnie do częściowych specjalizacji. Nie jestem pewien, jaki cel w tym konkretnym przypadku miałaby spełniać dodatkowa wersja.