Heim >Backend-Entwicklung >C++ >Wie kann die implizite Typkonvertierung in Vorlagenklassen aktiviert werden?

Wie kann die implizite Typkonvertierung in Vorlagenklassen aktiviert werden?

DDD
DDDOriginal
2024-11-17 16:45:02276Durchsuche

How Can Implicit Type Conversion Be Enabled in Template Classes?

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:

  • Generische Definition: Die Nicht-Template-Funktion wird generisch für jeden instanziierten Typ definiert und bietet sowohl Generizität als auch die Möglichkeit, sie zu verwenden, wenn Argumente keine perfekten Übereinstimmungen sind.
  • Implizite Konvertierungen: Da es sich um eine Nicht-Vorlagenfunktion handelt, kann der Compiler implizite Konvertierungen aufrufen auf beiden Argumenten, wodurch das erwartete Verhalten aktiviert wird.
  • Argumentabhängige Suche: Die Funktion kann nur durch eine argumentabhängige Suche gefunden werden, was bedeutet, dass sie nur berücksichtigt wird, wenn mindestens eines der Argumente vorhanden ist des gewünschten Typs.

Diese Lösung hat jedoch auch einige Einschränkungen:

  • Es schränkt die Sichtbarkeit der Funktion ein, da auf sie nur über ADL zugegriffen werden kann.
  • Es verhindert den Erhalt eines Funktionszeigers darauf.

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!

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