Implizite Typkonvertierung mit Vorlagen
Die Abfrage untersucht das Problem der Aktivierung der impliziten Typkonvertierung in Vorlagenklassen. Betrachten Sie den Fall einer Vorlagenklasse A mit einem Konstruktor, der eine Ganzzahl akzeptiert.
template <unsigned int m> class A { public: A(int); };
Darüber hinaus gibt es einen Operator „ “, der eine Instanz von A bei zwei gegebenen A-Objekten zurückgibt.
template<unsigned int m> A<m> operator+(const A<m>&, const A<m>&) { return A<m>(0); }
Das Problem tritt auf, wenn versucht wird, eine Ganzzahl implizit in ein A-Objekt umzuwandeln. Beispielsweise versucht der folgende Code dies, aber der Compiler gibt einen Fehler aus:
A<3> a(4); A<3> b = a + 5; A<3> c = 5 + a;
Lösung
Die Lösung liegt in der Ausnutzung einer Funktion der Sprache Dies ermöglicht die Definition von Friend-Funktionen, die keine Mitglieder sind, innerhalb einer Klassendefinition. Im Fall von Vorlagen generiert der Compiler für jede Instanziierung der Vorlage eine kostenlose Nicht-Vorlagenfunktion mit einer Signatur, die durch Ersetzen der realen Typen der Instanziierung in der Friend-Deklaration erhalten wird:
template <typename T> class test { friend test operator+(test const &, test const &); // [1] }; test<int> t; // [2]
In [ 1] ermöglicht der Compiler die Definition der Friend-Funktion innerhalb des Klassenbereichs. Wenn dann in [2] die Vorlage instanziiert wird, generiert der Compiler eine freie Funktion:
test<int> operator+(test<int> const &, test<int> const &) { return test<int>(); }
Diese Nicht-Vorlagenfunktion ist immer definiert, unabhängig davon, ob sie verwendet wird oder nicht.
Magie der impliziten Konvertierung
Die „Magie“ liegt hier im Folgenden Aspekte:
Diese Lösung hat jedoch auch einige Einschränkungen:
Trotzdem Angesichts dieser Einschränkungen bietet diese Lösung eine elegante Möglichkeit, die implizite Konvertierung innerhalb von Vorlagenklassen zu ermöglichen und so flexibleren und bequemeren Code zu ermöglichen.
Das obige ist der detaillierte Inhalt vonWie kann die implizite Typkonvertierung in Vorlagenklassen aktiviert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!