Heim >Backend-Entwicklung >C++ >Wie verbessern C 17-Vorlagenableitungsleitfäden die Ableitung von Vorlagenargumenten?

Wie verbessern C 17-Vorlagenableitungsleitfäden die Ableitung von Vorlagenargumenten?

Linda Hamilton
Linda HamiltonOriginal
2024-12-10 22:45:12393Durchsuche

How Do C  17 Template Deduction Guides Improve Template Argument Deduction?

Leitfäden zum Vorlagenabzug: Eine umfassende Erklärung

Einführung

C 17 führte eine leistungsstarke Funktion namens „Leitfäden zum Vorlagenabzug“ ein. ", die eine entscheidende Rolle bei der Verbesserung der Ableitung von Vorlagenargumenten für Konstrukteure spielen. Diese Funktion befasst sich mit der Herausforderung, beim Erstellen von Objekten mit Vorlagen die entsprechenden Vorlagenparameter abzuleiten.

Was sind Vorlagenableitungsleitfäden?

Vorlagenableitungsleitfäden sind mit einer Vorlage verknüpfte Muster Klasse. Sie unterstützen den Compiler bei der Übersetzung der an einen Konstruktor übergebenen Argumente in die entsprechenden Vorlagenparameter. Im Wesentlichen legen sie Regeln für den Compiler fest, um basierend auf den Argumenten des Konstruktors zu bestimmen, welche Vorlagenspezialisierung instanziiert werden soll.

Warum und wann Vorlagenabzugsleitfäden verwendet werden sollten

Vorlagenabzugsleitfäden sind erforderlich, wenn der Vorlagenparameter nicht direkt aus dem Typ der Konstruktorargumente abgeleitet werden kann. Diese Situation entsteht, wenn das Vorlagenargument nicht vom Typ eines einzelnen Arguments abgeleitet ist. Betrachten Sie beispielsweise den Fall des Konstruktors von std::vector, der ein Iteratorpaar akzeptiert:

template<typename Iterator>
void func(Iterator first, Iterator last)
{
  vector v(first, last);
}

In diesem Beispiel kann der T-Vorlagenparameter des Vektortyps nicht direkt aus den Iteratorargumenten abgeleitet werden. Es muss ein Abzugsleitfaden verwendet werden, um den Compiler darüber zu informieren, dass die richtige Spezialisierung vector::value_type> sein sollte.

Vorlagenabzugsleitfäden deklarieren

Vorlagen-Abzugsleitfäden werden wie folgt deklariert Syntax:

template class_name(constructor_args) -> template_args;
  • class_name: Der Name der Vorlagenklasse, für die der Leitfaden deklariert wird.
  • constructor_args: Die an den Konstruktor übergebenen Argumente, die mit dem Leitfaden übereinstimmen.
  • template_args: Die entsprechenden Vorlagenparameter abgeleitet.

Beispiel

Betrachten Sie das Beispiel des Ableitungsleitfadens von std::vector:

template<typename Iterator> vector(Iterator b, Iterator e) -> 
    vector<typename std::iterator_traits<Iterator>::value_type>;

Dieser Leitfaden weist den Compiler dazu an Beim Erstellen eines std::vector mithilfe des Konstruktormusters (Iteratorpaar) sollte das Vorlagenargument T abgeleitet werden als typename std::iterator_traits::value_type.

Leitfäden zur Aggregatinitialisierung und Vorlagenableitung

Interessanterweise können Leitfäden zur Vorlagenableitung auch mit Aggregaten und der Aggregatinitialisierung verwendet werden :

template<typename T>
struct Thingy
{
  T t;
};

Thingy(const char *) -> Thingy<std::string>;

Thingy thing{"A String"}; //thing.t is a `std::string`.

In diesem Beispiel wird ein Vorlagen-Abzugsleitfaden verwendet um den Vorlagenparameter T von Thingy basierend auf dem Typ des an den Aggregatkonstruktor übergebenen String-Literals abzuleiten.

Schlussfolgerung

Vorlagenableitungsleitfäden sind ein leistungsstarkes Tool zum Aktivieren der Typinferenz beim Erstellen von Vorlagenobjekten. Durch die explizite Definition, wie Konstruktorargumente in Vorlagenparameter übersetzt werden, können Programmierer den Prozess der Vorlageninstanziierung erheblich vereinfachen und die Lesbarkeit des Codes verbessern.

Das obige ist der detaillierte Inhalt vonWie verbessern C 17-Vorlagenableitungsleitfäden die Ableitung von Vorlagenargumenten?. 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