Heim >Backend-Entwicklung >C++ >Wie vereinfachen C 17 Template Deduction Guides die Inferenz von Template-Argumenten?

Wie vereinfachen C 17 Template Deduction Guides die Inferenz von Template-Argumenten?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-09 14:11:15596Durchsuche

How Do C  17 Template Deduction Guides Simplify Template Argument Inference?

C 17 Template-Abzugsleitfäden: Eine einfache Erklärung

Was sind Template-Abzugsleitfäden?

Vorlagenableitungsleitfäden sind eine in C 17 eingeführte Funktion, die dem Compiler dabei hilft, Vorlagenargumente für Konstruktoren abzuleiten. Sie bieten eine Möglichkeit anzugeben, wie Konstruktorargumente und ihre Typen Vorlagenparametern zugeordnet werden.

Warum (und wann) brauchen wir sie?

Leitfäden zur Vorlagenableitung sind erforderlich wenn die Ableitung von Vorlagenargumenten aus Konstruktorargumenten nicht direkt aus den Argumenttypen erfolgen kann. Beispielsweise erfordert die Initialisierung eines Vektors aus einem Iteratorpaar Kenntnisse über den zugrunde liegenden Werttyp des Iterators.

Wie werden sie deklariert?

Vorlagenableitungsleitfäden werden mithilfe von deklariert die folgende Syntax:

template <template-argument-list>
class-template id (function-parameter-list) -> deduced-type;

Hier gibt template-argument-list die Vorlagenargumente an, die verwendet werden deduced, function-parameter-list stellt die Konstruktorargumente dar und deduced-type ist der resultierende abgeleitete Vorlagentyp.

Beispiel:

Betrachten Sie den Konstruktor std::vector das erfordert ein Iteratorpaar:

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

Um den Typ T des Vektors abzuleiten, müssen wir verwenden eine Anleitung zur Vorlagenableitung:

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

Diese Anleitung weist den Compiler an, T als value_type des std::iterator_traits für den angegebenen Iteratortyp abzuleiten.

Aggregatinitialisierung mit Abzug Leitfäden:

Vorlagen-Abzugsleitfäden können auch mit Aggregat verwendet werden Initialisierung:

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 ermöglicht der Abzugsleitfaden die Initialisierung von Thingy mit einem const char*, während T als std::string abgeleitet wird.

Hinweis: Ableitungsleitfäden werden nur zum Ableiten von Vorlagenargumenten verwendet. Der eigentliche Initialisierungsprozess folgt den gleichen Regeln wie zuvor, unabhängig von der gewählten Abzugsanleitung.

Das obige ist der detaillierte Inhalt vonWie vereinfachen C 17 Template Deduction Guides die Inferenz von Template-Argumenten?. 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