Heim >Backend-Entwicklung >C++ >SFINAE in C: Vorlagenparameter vs. Rückgabetyp – Was ist der Unterschied?
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
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
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!