Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erreicht man eine elegante implizite Typkonvertierung mit Template-Friend-Funktionen?

Wie erreicht man eine elegante implizite Typkonvertierung mit Template-Friend-Funktionen?

DDD
DDDOriginal
2024-11-09 11:52:02244Durchsuche

How to Achieve Elegant Implicit Type Conversion with Template Friend Functions?

Elegante implizite Typkonvertierung mit Template-Friend-Funktionen

Beim Umgang mit Template-Klassen kann die Aktivierung der impliziten Typkonvertierung eine Herausforderung sein. Betrachten Sie die Klassenvorlage A mit einem Konstruktor, der ein int und eine Operatorüberladung zum Hinzufügen akzeptiert:

template <unsigned int m>
class A {
public:
    A(int) {}
};

template<unsigned int m>
A<m> operator+(const A<m>&, const A<m>&) {
    return A<m>(0);
}

Normalerweise erfordert der Aufruf des Konstruktors mit einem int eine explizite Umwandlung. Das folgende Beispiel führt jedoch zu Kompilierungsfehlern:

A<3> a(4);
A<3> b = a + 5;
A<3> c = 5 + a;

Das Problem der exakten Typübereinstimmung

Das Problem liegt darin, wie die Überlastungsauflösung für Vorlagenfunktionen funktioniert. Während der Typableitung sucht der Compiler nach genauen Übereinstimmungen für Vorlagenparameter. In unserem Fall gelingt es nicht, das int-Argument mit dem Konstruktor abzugleichen, weil die Typen nicht genau übereinstimmen.

Die Lösung: Non-Member-Friend-Funktionen

Eine elegante Die Lösung besteht darin, eine Nicht-Mitglieds-Friend-Funktion innerhalb der Klassendefinition zu definieren:

template <typename T>
class test {
    friend test operator+(test const &, test const &) {
        return test();
    }
};

Für jede Vorlageninstanziierung generiert der Compiler eine separate Nicht-Vorlagenfunktion auf Namespace-Ebene mit der entsprechenden Signatur:

test<int> operator+(test<int> const &, test<int> const &) { 
   return test<int>();
}

Vorteile von Nicht-Member-Friend-Funktionen

  • Generizität: Sie stellen Nicht-Template-Funktionen für alle instanziierten Typen bereit, sodass sie generisch verwendbar sind .
  • Implizite Konvertierungen: Da sie keine Vorlagenfunktionen sind, können sie implizite Konvertierungen für beide Argumente nutzen und so das Problem der Typkonflikte lösen.

Das obige ist der detaillierte Inhalt vonWie erreicht man eine elegante implizite Typkonvertierung mit Template-Friend-Funktionen?. 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