Heim >Backend-Entwicklung >C++ >SFINAE in C: Vorlagenparameter vs. Rückgabetyp – Was ist der Unterschied?

SFINAE in C: Vorlagenparameter vs. Rückgabetyp – Was ist der Unterschied?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-14 05:53:171001Durchsuche

SFINAE in C  : Template Parameter vs. Return Type – What's the Difference?

SFINAE im Rückgabetyp vs. Vorlagenparameter: Ein Vergleich

In C ist die Substitution Failure Is Not An Error (SFINAE)-Sprache bedingt zulässig Kompilierung basierend auf der Verfügbarkeit von Typen. Sein Verhalten kann jedoch variieren, wenn es an verschiedenen Positionen innerhalb einer Vorlage platziert wird.

SFINAE im Vorlagenparameter

Im folgenden Code wird SFINAE als Vorlagenparameter verwendet Aktivieren oder deaktivieren Sie eine bestimmte Vorlagenfunktionsüberladung.

template<typename T,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void { /* ... */ }

template<typename T,
         typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void { /* ... */ }

In diesem Fall wird SFINAE auf den zweiten Vorlagenparameter angewendet, der praktisch ein Platzhalter ist. Der Fehler tritt auf, wenn versucht wird, foo(3.4) aufzurufen, da die zweite Vorlagenfunktionsdeklaration mit std::enable_if::value> ist nicht definiert, was zu einer fehlenden Überladung führt.

SFINAE im Rückgabetyp

Im Gegensatz dazu verwendet der folgende Code SFINAE im Rückgabetyp:

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type { /* ... */ }

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type { /* ... */ }

In diesem Fall wird SFINAE auf den Rückgabetyp angewendet, wodurch der Compiler anhand des bereitgestellten Arguments zwischen den beiden Vorlagenfunktionen unterscheiden kann Typ.

Warum der Unterschied?

Der Unterschied im Verhalten ergibt sich aus der Verwendung von Standardvorlagenargumenten. Im ersten Beispiel ist der zweite Vorlagenparameter standardmäßig auf den Typnamen std::enable_if::value>::type eingestellt, wodurch die Funktionsdeklarationen der Vorlage äquivalent werden.

Allerdings in Im zweiten Beispiel verwendet der Rückgabetyp SFINAE innerhalb eines Ausdrucks, der Teil der Funktionssignatur ist. Dadurch wird sichergestellt, dass die Vorlagenfunktionen unterschiedliche Signaturen haben und SFINAE wie erwartet funktioniert.

Das obige ist der detaillierte Inhalt vonSFINAE in C: Vorlagenparameter vs. Rückgabetyp – Was ist der Unterschied?. 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