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
Linda HamiltonOriginal
2024-12-27 04:43:51638Durchsuche

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;

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!

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