„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie wähle ich eine Mitgliedsfunktion basierend auf einem Vorlagenparameter mit „enable_if“ aus?

Wie wähle ich eine Mitgliedsfunktion basierend auf einem Vorlagenparameter mit „enable_if“ aus?

Veröffentlicht am 06.11.2024
Durchsuche:968

How to Select a Member Function Based on a Template Parameter Using `enable_if`?

Auswählen einer Mitgliedsfunktion mithilfe von Enable_If-Bedingungen

Die Aufgabe besteht darin, den Aufruf einer Mitgliedsfunktion basierend auf einem Klassenvorlagenparameter zu bestimmen. Das folgende Code-Snippet versucht dies zu erreichen:

#include 
#include 

template
struct Point
{
  void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
  {
    std::cout ::value, float &>::type* = 0)
  {
    std::cout 

Dieser Code kann jedoch nicht kompiliert werden und es kommt der Fehler „kein Typ namens ‚type‘ in ‚struct std::enable_if‘“.

SFINAE in Action

Der Schlüssel zum Verständnis dieses Problems liegt im Konzept von Substitution Failure Is Not An Error (SFINAE). Enable_if ermöglicht die bedingte Kompilierung basierend auf Vorlagenargumenten. In diesem Fall ist das Vorlagenargument T bereits bekannt, wenn die Memberfunktionen instanziiert werden. Daher wird die Bedingung zum Zeitpunkt der Instanziierung ausgewertet und die entsprechende Funktion ausgewählt.

Korrektur des Codes

Um dies zu beheben, müssen wir ein Dummy-Vorlagenargument einführen ist standardmäßig auf T eingestellt. Dadurch kann der SFINAE-Mechanismus wie vorgesehen funktionieren. Der geänderte Code würde so aussehen:

template
struct Point
{
  template
  typename std::enable_if<:is_same int>::value>::type
    MyFunction()
  {
    std::cout 
  typename std::enable_if<:is_same float>::value>::type
    MyFunction()
  {
    std::cout 

Verhindern der expliziten Spezialisierung von Mitgliedsfunktionen

Wie von HostileFork hervorgehoben, ermöglicht der Originalcode die explizite Angabe von Vorlagenargumenten für die Mitgliedsfunktionen, was zu Folgendem führen könnte: falsche Ergebnisse. Um dies zu verhindern, können wir ein static_assert hinzufügen, das prüft, ob Vorlagenargumente bereitgestellt werden. Dadurch wird sichergestellt, dass immer die richtige Memberfunktion basierend auf dem Vorlagenargument T aufgerufen wird. Der geänderte Code wäre:

template
struct Point
{
  template
  typename std::enable_if<:is_same int>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout 
  typename std::enable_if<:is_same float>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout 
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3