Heim >Backend-Entwicklung >C++ >Wie funktioniert std::enable_if mit bedingten Rückgabetypen und Vorlagenparametern?

Wie funktioniert std::enable_if mit bedingten Rückgabetypen und Vorlagenparametern?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-05 21:26:02992Durchsuche

How Does std::enable_if Work with Conditional Return Types and Template Parameters?

Std::enable_if verstehen

Std::enable_if verstehen erfordert ein Verständnis davon, dass Substitutionsfehler kein Fehler sind.

Definition von std::enable_if

std::enable_if ist eine spezielle Vorlage, die wie folgt definiert ist:

<code class="cpp">template<bool Cond, class T = void> struct enable_if {};
template<class T> struct enable_if<true, T> { typedef T type; };</code>

Entscheidend ist, dass die Typedef-T-Typdefinition nur ausgelöst wird, wenn bool Cond ist wahr.

Verwendung in bedingten Rückgabetypen

Betrachten Sie das Beispiel:

<code class="cpp">template<typename T>
typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type foo(const T &bar) { isInt(bar); }</code>

Hier wird der Rückgabetyp definiert durch:

<code class="cpp">std::enable_if<std::numeric_limits<T>::is_integer, void>::type</code>

Die Verwendung von enable_if stellt sicher, dass foo nur dann einen gültigen Rückgabetyp hat, wenn is_integer für T wahr ist.

Standardeinstellung des zweiten Vorlagenparameters

Im Beispiel:

<code class="cpp">template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void foo(const T& bar) { isInt(); }</code>

Der zweite Template-Parameter ist standardmäßig auf 0 eingestellt. Dadurch kann foo mit einem einzigen Template-Parameter aufgerufen werden, z.B. foo(1);.

Das obige ist der detaillierte Inhalt vonWie funktioniert std::enable_if mit bedingten Rückgabetypen und Vorlagenparametern?. 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