Heim > Backend-Entwicklung > C++ > Hauptteil

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

DDD
Freigeben: 2024-11-09 11:52:02
Original
242 Leute haben es durchsucht

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);
}
Nach dem Login kopieren

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;
Nach dem Login kopieren

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();
    }
};
Nach dem Login kopieren

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>();
}
Nach dem Login kopieren

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!

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