Heim >Backend-Entwicklung >C++ >Warum gibt es in C-Vorlagen eine scheinbar bedeutungslose Zuweisung zu std::enable_if?

Warum gibt es in C-Vorlagen eine scheinbar bedeutungslose Zuweisung zu std::enable_if?

Linda Hamilton
Linda HamiltonOriginal
2024-11-06 10:49:02703Durchsuche

Why is there a Seemingly Meaningless Assignment to std::enable_if in C   Templates?

Das Innenleben von std::enable_if verstehen

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(1); aufgerufen werden können. Ohne Standardeinstellung würde der Aufruf von foo zwei Vorlagenparameter statt nur int erfordern.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn