Heim > Backend-Entwicklung > C++ > SFINAE in C: Rückgabetyp vs. Parametertyp für bedingte Vorlagenspezialisierung?

SFINAE in C: Rückgabetyp vs. Parametertyp für bedingte Vorlagenspezialisierung?

Mary-Kate Olsen
Freigeben: 2024-12-13 02:33:13
Original
678 Leute haben es durchsucht

SFINAE in C  : Return Type vs. Parameter Type for Conditional Template Specialization?

SFINAE in Template-Rückgabetypen vs. Parametern

Problembeschreibung

In C kann SFINAE (Substitution Failure Is Not An Error) verwendet werden Vorlagenspezialisierungen basierend auf Typmerkmalen bedingt aktivieren oder deaktivieren. Ein häufiges Problem tritt jedoch auf, wenn SFINAE in Vorlagenrückgabetypen und Vorlagenparametern unterschiedlich angewendet wird.

Bedenken Sie die folgende Hauptfunktion:

int main()
{
    foo(5);
    foo(3.4);
}
Nach dem Login kopieren

Fehlerhafte Implementierung mit SFINAE in Vorlagenparametern

Wenn SFINAE wie unten gezeigt in Vorlagenparametern platziert wird, schlägt die Kompilierung mit an fehl Fehler:

template<typename T,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void
{
    std::cout << "I'm an integrer!\n";
}

template<typename T,
         typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void
{
    std::cout << "I'm a floating point number!\n";
}
Nach dem Login kopieren

Korrekte Implementierung mit SFINAE in Rückgabetypen

Diese Implementierung funktioniert jedoch korrekt:

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type
{
    std::cout << "I'm an integrer!\n";
}

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type
{
    std::cout << "I'm a floating point number!\n";
}
Nach dem Login kopieren

Erklärung

Der Unterschied liegt in der Art und Weise, wie das Überladen von Funktionsvorlagen im C-Standard (14.5.6.1) definiert ist. Überladene Vorlagen sind gleichwertig, wenn sie denselben Funktionsnamen, dieselbe Anzahl von Parametern und dieselben Parametertypen haben. Standard-Template-Argumente werden in diesem Vergleich jedoch nicht berücksichtigt.

In der fehlerhaften Implementierung ist die SFINAE-Bedingung als Standard-Template-Argument enthalten, was dazu führt, dass zwei identische Funktionstemplates doppelt definiert werden. Dies löst den Kompilierungsfehler aus.

In der korrekten Implementierung wird die SFINAE-Bedingung als Teil des Vorlagenrückgabetyps verwendet. Da es sich dabei um ausdrucksverweisende Vorlagenparameter handelt, haben die beiden Funktionen unterschiedliche Signaturen und ermöglichen somit, dass SFINAE wie vorgesehen funktioniert.

Das obige ist der detaillierte Inhalt vonSFINAE in C: Rückgabetyp vs. Parametertyp für bedingte Vorlagenspezialisierung?. 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