Heim > Backend-Entwicklung > C++ > Wie implementiert man bedingte Member-Funktionsüberladungen mithilfe von enable_if in C?

Wie implementiert man bedingte Member-Funktionsüberladungen mithilfe von enable_if in C?

Patricia Arquette
Freigeben: 2024-10-28 14:18:30
Original
811 Leute haben es durchsucht

How to Implement Conditional Member Function Overloads Using enable_if in C  ?

Auswählen einer Mitgliedsfunktion mit verschiedenen „enable_if“-Bedingungen

In C ist „enable_if“ ein Tool, das verwendet wird, um bestimmten Code abhängig davon bedingt zu aktivieren oder zu deaktivieren Ein Vorlagenargument erfüllt bestimmte Kriterien. Dies kann nützlich sein, wenn Sie das Verhalten einer Klasse oder Funktion basierend auf ihren Vorlagenparametern anpassen möchten.

Im angegebenen Beispiel besteht das Ziel darin, eine Mitgliedsfunktion MyFunction zu erstellen, die sich je nach Vorlage unterschiedlich verhält Parameter T ist eine Ganzzahl oder nicht. Die beabsichtigte Implementierung besteht darin, zwei Überladungen von MyFunction zu verwenden, eine für T = int und eine für T != int.

Ein Ansatz, dies zu erreichen, ist enable_if, wie im folgenden Code gezeigt:

<code class="cpp">template<typename T>
struct Point {
  void MyFunction(
    typename std::enable_if<std::is_same<T, int>::value, T >::type* = 0) {
    std::cout << "T is int." << std::endl;
  }

  void MyFunction(
    typename std::enable_if<!std::is_same<T, int>::value, float >::type* = 0) {
    std::cout << "T is not int." << std::endl;
  }
};</code>
Nach dem Login kopieren

Dieser Code führt jedoch aufgrund der falschen Verwendung von enable_if zu Kompilierungsfehlern. In C erfolgt die Ersetzung von Vorlagenargumenten während der Überladungsauflösung. In diesem Fall findet keine Ersetzung statt, da der Typ von T zum Zeitpunkt der Instanziierung der Mitgliedsfunktion bekannt ist.

Um dieses Problem zu beheben, kann ein Dummy-Vorlagenparameter eingeführt und standardmäßig auf T gesetzt werden, was SFINAE ermöglicht (Substitutionsfehler ist kein Fehler) ordnungsgemäß zu funktionieren:

<code class="cpp">template<typename T>
struct Point {
  template<typename U = T>
  typename std::enable_if<std::is_same<U, int>::value>::type MyFunction() {
    std::cout << "T is int." << std::endl;
  }

  template<typename U = T>
  typename std::enable_if<std::is_same<U, float>::value>::type MyFunction() {
    std::cout << "T is not int." << std::endl;
  }
};</code>
Nach dem Login kopieren

Dieser Ansatz stellt sicher, dass die richtige Version von MyFunction basierend auf dem Wert von T ausgewählt wird.

Das obige ist der detaillierte Inhalt vonWie implementiert man bedingte Member-Funktionsüberladungen mithilfe von enable_if in C?. 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