Heim > Backend-Entwicklung > C++ > Wie unterscheidet sich das SFINAE-Verhalten zwischen Rückgabetypen und Vorlagenparametern bei C-Funktionsüberladungen?

Wie unterscheidet sich das SFINAE-Verhalten zwischen Rückgabetypen und Vorlagenparametern bei C-Funktionsüberladungen?

Linda Hamilton
Freigeben: 2024-12-27 04:43:51
Original
631 Leute haben es durchsucht

How Does SFINAE Behavior Differ Between Return Types and Template Parameters in C   Function Overloads?

SFINAE-Verhaltensvarianz in Rückgabetypen im Vergleich zu Vorlagenparametern

In C erlaubt das SFINAE-Idiom (Substitute Failure Is Not an Error) bedingte Bedingungen Funktionsüberladungen basierend auf Template-Metaprogrammierung und Typmerkmalen. Es gibt jedoch Fälle, in denen sich SFINAE abhängig von seiner Platzierung in der Funktionsvorlagendeklaration unterschiedlich verhält.

Beachten Sie den folgenden Code:

template<typename T,
         typename = typename std::enable_if<
                        std::is_integral<T>::value>::type>
void foo(T);  // Incorrect placement, triggers error

template<typename T,
         typename = typename std::enable_if<
                        std::is_floating_point<T>::value>::type>
void foo(T);  // Incorrect placement, triggers error

template<typename T>
void foo(T)    // Correct placement
    -> typename std::enable_if<
            std::is_integral<T>::value>::type;

template<typename T>
void foo(T)    // Correct placement
    -> typename std::enable_if<
            std::is_floating_point<T>::value>::type;
Nach dem Login kopieren

Im ersten Satz von Überladungen (falsche Platzierung) Das Platzieren von SFINAE in den Vorlagenparametern statt im Rückgabetyp führt zu einem Kompilierungsfehler. Dies liegt daran, dass Standardvorlagenargumente (in diesem Fall das Suffix ::type) bei der Bestimmung der Überladungsäquivalenz nicht berücksichtigt werden. Folglich behandelt der Compiler die Funktionen als doppelte Deklarationen mit derselben Signatur.

Im zweiten Satz von Überladungen (richtige Platzierung) wird jedoch SFINAE auf den Rückgabetyp angewendet, was eine Vorlagen-Metaprogrammierung beinhaltet. Durch diese Platzierung wird sichergestellt, dass der Ausdruck, der sich auf Vorlagenparameter bezieht, Teil der Funktionssignatur ist. Infolgedessen erkennt der Compiler die Überladungen als unterschiedliche Einheiten, sodass SFINAE ordnungsgemäß funktioniert.

Das obige ist der detaillierte Inhalt vonWie unterscheidet sich das SFINAE-Verhalten zwischen Rückgabetypen und Vorlagenparametern bei C-Funktionsüberladungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage