In einer aktuellen Frage wurde die Verwendung von std::enable_if als bedingter Rückgabetyp besprochen. Während die erste Verwendung klar war, blieb die zweite, die eine scheinbar bedeutungslose Zuweisung an std::enable_if beinhaltete, rätselhaft.
Entschlüsselung des Konzepts
Um das Rätsel zu lösen , müssen wir uns mit der Definition von std::enable_if: befassen:
template<bool Cond, class T = void> struct enable_if {}; template<class T> struct enable_if<true, T> { typedef T type; };
Der Schlüssel liegt in der Tatsache, dass typedef T type nur definiert wird, wenn bool Cond wahr ist.
Anwendung auf das Beispiel
Mit diesem Verständnis schauen wir uns den Code noch einmal an:
template<typename T> typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type foo(const T &bar) { isInt(bar); }
Hier wird std::enable_if verwendet, um den Rückgabetyp der foo-Funktion zu definieren . Wenn T eine Ganzzahl ist, ist der Rückgabetyp void; Andernfalls wird die Funktion nicht kompiliert.
Die Rolle der Standardeinstellung
Im zweiten Beispiel:
template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0> void foo(const T& bar) { isInt(); }
Der Standardparameter = 0 stellt sicher dass beide Optionen mit foo
Evolving the Understanding
In C 14 wird der Typ std::enable_if_t eingeführt, welches anstelle des Typedef-Formulars verwendet werden sollte. Dies führt zu einem prägnanteren Rückgabetyp:
std::enable_if_t<std::numeric_limits<T>::is_integer>
Das obige ist der detaillierte Inhalt vonWarum gibt es in C-Vorlagen eine scheinbar bedeutungslose Zuweisung zu std::enable_if?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!