Heim > Backend-Entwicklung > C++ > Hauptteil

Warum schlägt „enable_if_t' in Funktionsdefinitionen fehl?

DDD
Freigeben: 2024-11-18 03:21:02
Original
264 Leute haben es durchsucht

Why Does `enable_if_t` Fail in Function Definitions?

Konflikt von Vorlagenargumenten: Warum enable_if_t in Definitionen fehlschlägt

Bei der Vorlagenprogrammierung kommt es nicht selten vor, dass wir auf Situationen stoßen, in denen wir eine bedingte Aktivierung benötigen oder deaktivieren Sie Vorlagenfunktionen basierend auf einer bestimmten Bedingung. In solchen Fällen wird häufig die Vorlage std::enable_if verwendet, um dies zu erreichen. Ein kürzlicher Versuch, die neuere Syntax von std::enable_if_t zu verwenden, hat jedoch zu unerwarteten Fehlern geführt.

Im folgenden Codeausschnitt definieren wir zwei Vorlagenfunktionen f() mit std::enable_if:

template<typename T,
         typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }

template<typename T,
         typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }
Nach dem Login kopieren

Beim Portieren dieses Codes zur Verwendung der neuen std::enable_if_t-Syntax stoßen wir auf ein Problem:

template<typename T,
         typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }

template<typename T,
         typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }
Nach dem Login kopieren

GCC beschwert sich über den folgenden Fehler:

error: redefinition of 'template<class T, class> void g()'
       void g() { }
Nach dem Login kopieren

Um zu verstehen, warum dieser Fehler auftritt, müssen wir die Syntax von Vorlagenargumenten untersuchen. Indem wir unnötigen Code entfernen, erhalten wir die folgende vereinfachte Darstellung unserer Funktionen:

template<
  class T,
  class U/* = std::enable_if_t<std::is_same<int, T>::value>*/
>
void g() { }

template<
  class T,
  class U/* = std::enable_if_t<std::is_same<double, T>::value>*/
>
void g() { }
Nach dem Login kopieren

Es wird deutlich, dass beide Vorlagen unabhängig von ihren unterschiedlichen Standardwerten vom gleichen Typ templatevoid() sind für das zweite Typargument. Dies steht im Widerspruch zur C-Anforderung, dass zwei Vorlagenfunktionen desselben Vorlagentyps unterschiedliche Signaturen haben müssen.

Um dieses Problem zu lösen, können wir das zweite Argument in einen Zeigertyp mit einem abhängigen Typ ändern:

template<
  class T,
  std::enable_if_t<std::is_same<int, T>::value, int>* = nullptr
>
void f() { }

template<
  class T,
  std::enable_if_t<std::is_same<double, T>::value, int>* = nullptr
>
void f() { }
Nach dem Login kopieren

In diesem geänderten Code ist die Signatur der Vorlagenfunktionen jetzt eindeutig, wodurch der Konflikt beseitigt und die korrekte Vorlagenübereinstimmung ermöglicht wird.

Das obige ist der detaillierte Inhalt vonWarum schlägt „enable_if_t' in Funktionsdefinitionen fehl?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage