Heim >Backend-Entwicklung >C++ >Wie funktioniert „std::enable_if': Die Geheimnisse seiner Implementierung und Verwendung aufdecken?

Wie funktioniert „std::enable_if': Die Geheimnisse seiner Implementierung und Verwendung aufdecken?

Barbara Streisand
Barbara StreisandOriginal
2024-11-05 07:52:02752Durchsuche

How Does `std::enable_if` Work: Unraveling the Mysteries of Its Implementation and Usage?

Std::enable_if verstehen: Zweck und Implementierung entschlüsseln

Während die Natur von std::enable_if in bestimmten Kontexten verstanden wird, ist es Feinheiten, insbesondere das zweite Argument und die Zuweisung an std::enable_if innerhalb der Template-Anweisung, bleiben rätselhaft. Ein tieferes Eintauchen in seine Funktionsweise wird diese Geheimnisse lüften.

Das Wesentliche 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 der Typalias typedef T type nur definiert wird, wenn Cond wahr ist.

Enthüllung der Verwendung

Beachten Sie die folgende Deklaration:

<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 von foo durch std::enable_if::is_integer, void>::type definiert. Da std::numeric_limits::is_integer eine boolesche Bedingung ist, wird dieser Rückgabetyp nur definiert, wenn die Bedingung wahr ist.

Klarstellung des zweiten Arguments

In der Notation:

<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>

= 0 wird als Standard für den zweiten Vorlagenparameter verwendet. Dadurch können beide Optionen mit foo(1) aufgerufen werden, anstatt zwei Vorlagenparameter zu erfordern, wenn der Parameter std::enable_if nicht standardmäßig festgelegt wäre.

Bemerkenswerte Details

  • Das explizite Eingeben des Typnamens std::enable_if::type erhöht die Klarheit.
  • In C 14 ist enable_if_t ein etablierter Typ, der für verwendet werden sollte Rückgabetyp, der zu std::enable_if_t vereinfacht wird.
  • Für Visual Studio-Versionen vor 2013 kann nur der Rückgabetyp „enable_if“ verwenden.

Das obige ist der detaillierte Inhalt vonWie funktioniert „std::enable_if': Die Geheimnisse seiner Implementierung und Verwendung aufdecken?. 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