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
Patricia ArquetteOriginal
2024-10-28 14:18:30757Durchsuche

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>

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>

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!

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