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
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!