2016-08-17 5 views
2

Ich versuche, die enable_if Implementierung zu verstehen, die ein Paar Vorlagenklassen ist. was ich nicht verstehe, warum enable_if<true, int> nicht mit dem ersten übereinstimmt? Wie ist das entschieden?Wie ist die Vorlagenklasse angepasst

#include <iostream> 

template <bool, class T = void> 
struct enable_if 
{ 
    enable_if() { std::cout << "invalid type";} 
}; 

template <class T> 
struct enable_if<true, T> 
{ 
    typedef T type; 
    enable_if() { std::cout <<"valid type";} 
}; 

int main(){ 
    enable_if<0==0, int> example; // print "valid type" 
    return 0; 
} 
+0

Beste Passform und andere Sachen. Wenn die explizite Spezialisierung gewählt werden kann, wird dies der Fall sein, ansonsten Standardvorlage. – DeiDei

+1

Es heißt [partielle Sortierung] (http://en.cppreference.com/w/cpp/language/partial_specialization#Partial_ordering) – Praetorian

Antwort

8

Es gibt zwei Schritte.

  1. Wir passen die primäre Klassenvorlage: enable_if<true, int> Spiele enable_if<bool, T>. Wenn es auf der Primärseite Standardargumente gäbe, würden wir sie an dieser Stelle füllen.
  2. Wir zählen alle Spezialisierungen der primären Klasse Vorlage, die auch übereinstimmen, die wäre:
    a. enable_if<bool, T>, mit bool=true und T=int
    b. enable_if<true, T>, mit T=int

    Wir holen die spezialisierteste Spezialisierung durch einen Prozess teilweise Ordnung genannt, die Sie informell als Kommissionierung die spezifischste man denken kann. In diesem Fall ist (2b) spezifischer als (2a), weil alle (2b) Instanziierungen mit (2a) übereinstimmen könnten, aber nicht umgekehrt, also wählen wir diesen aus.

Und so, am Ende mit einer Instanziierung enable_if<true, T> mit T=int auf.

Verwandte Themen