Namespaces
Variants

Templates

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Eine Vorlage ist eine C++-Entität, die eines der folgenden Elemente definiert:

(seit C++11)
(seit C++14)
(seit C++20)

Templates werden durch einen oder mehrere Template-Parameter parametrisiert, von drei Arten: Typ-Template-Parameter, konstante Template-Parameter und Template-Template-Parameter.

Wenn Template-Argumente angegeben werden, oder, nur für Funktions- und Klassen- (seit C++17) Templates, deduziert werden, werden sie für die Template-Parameter substituiert, um eine Spezialisierung des Templates zu erhalten, das heißt einen spezifischen Typ oder einen spezifischen Funktions-Lvalue.

Spezialisierungen können auch explizit bereitgestellt werden: Vollständige Spezialisierungen sind erlaubt für Klassen- , Variablen- (seit C++14) und Funktionstemplates, Partielle Spezialisierungen sind nur für Klassentemplates und Variablentemplates (seit C++14) erlaubt.

Wenn eine Klassen-Template-Spezialisierung in einem Kontext referenziert wird, der einen vollständigen Objekttyp erfordert, oder wenn eine Funktions-Template-Spezialisierung in einem Kontext referenziert wird, der erfordert, dass eine Funktionsdefinition existiert, wird das Template instanziiert (der Code dafür wird tatsächlich kompiliert), es sei denn, das Template wurde bereits explizit spezialisiert oder explizit instanziiert. Die Instanziierung eines Klassen-Templates instanziiert keine seiner Memberfunktionen, sofern sie nicht ebenfalls verwendet werden. Zur Linkzeit werden identische Instanziierungen, die von verschiedenen Translation Units erzeugt wurden, zusammengeführt.

Die Definition eines Klassentemplates muss an der Stelle der impliziten Instanziierung sichtbar sein, weshalb Template-Bibliotheken typischerweise alle Template-Definitionen in den Headern bereitstellen (z.B., die meisten Boost-Bibliotheken sind header-only ).

Inhaltsverzeichnis

Syntax

template < Parameterliste  > Requires-Klausel  (optional) Deklaration (1)
export template < Parameterliste  > Deklaration (2) (bis C++11)
template < Parameterliste  > concept Konzeptname = Constraint-Ausdruck  ; (3) (seit C++20)
parameter-list - eine nicht-leere, kommagetrennte Liste der template parameters , von denen jeder entweder ein constant parameter , ein type parameter , ein template parameter oder ein parameter pack von einem dieser Typen ist (seit C++11) .
requires-clause - (seit C++20) eine requires-clause , die die constraints für die Template-Argumente spezifiziert.
declaration - Deklaration einer class (including struct and union) , einer member class or member enumeration type , einer function oder member function , eines static data member im Namensbereich , einer variable oder static data member im Klassenbereich (seit C++14) oder eines alias template (seit C++11) . Sie kann auch eine template specialization definieren.
concept-name
constraint-expression
- siehe constraints and concepts

export war ein optionaler Modifikator, der das Template als exportiert deklarierte (bei Verwendung mit einem Klassentemplate deklarierte es ebenfalls alle seine Member als exportiert). Dateien, die exportierte Templates instanziierten, mussten deren Definitionen nicht einschließen: die Deklaration war ausreichend. Implementierungen von export waren selten und stimmten in Details nicht miteinander überein.

(bis C++11)

Template-Kennungen

Eine Template-Kennung hat eine der folgenden Syntaxen:

template-name  < template-argument-list  (optional) > (1)
operator op  < template-argument-list  (optional) > (2)
operator "" identifier < template-argument-list  (optional) > (3) (seit C++11)
(veraltet)
operator user-defined-string-literal < template-argument-list  (optional) > (4) (seit C++11)
1) Ein einfacher Template-Bezeichner .
2) Eine Operatorfunktionsvorlagenkennung.
3,4) Ein literal operator Funktions-Template-Bezeichner.
template-name - ein Identifier , der ein Template benennt
op - ein überladbarer Operator
identifier - ein Identifier
user-defined-string-literal - "" gefolgt von einem Identifier


Ein einfacher Template-Bezeichner, der eine Klassentemplatespezialisierung benennt, benennt eine Klasse.

Eine Template-Kennung, die eine Alias-Template-Spezialisierung benennt, benennt einen Typ.

Eine Template-Kennung, die eine Funktionstemplatespezialisierung benennt, benennt eine Funktion.

Wenn alle folgenden Bedingungen erfüllt sind, ist eine Template-Kennung valid :

  • Es gibt höchstens so viele Argumente wie Parameter oder ein Parameter ist ein Template parameter pack (since C++11) .
  • Es gibt ein Argument für jeden nicht-deduzierbaren non-pack (since C++11) Parameter, der kein Standard-Template-Argument hat.
  • Jedes Template-Argument passt zum entsprechenden Template-Parameter.
  • Die Substitution jedes Template-Arguments in die folgenden Template-Parameter (falls vorhanden) ist erfolgreich.
  • Wenn der Template-Bezeichner nicht-abhängig ist, werden die assoziierten Constraints wie nachfolgend spezifiziert erfüllt.
(seit C++20)

Eine ungültige einfache Template-ID ist ein Kompilierzeitfehler, es sei denn, sie benennt eine Funktions-Template-Spezialisierung (in welchem Fall SFINAE anwendbar sein kann).

template<class T, T::type n = 0>
class X;
struct S
{
    using type = int;
};
using T1 = X<S, int, int>; // Fehler: zu viele Argumente
using T2 = X<>;            // Fehler: kein Standardargument für ersten Template-Parameter
using T3 = X<1>;           // Fehler: Wert 1 passt nicht zum Typ-Parameter
using T4 = X<int>;         // Fehler: Substitutionsfehler für zweiten Template-Parameter
using T5 = X<S>;           // OK

Wenn der template-name einer einfachen Template-ID einen eingeschränkten Nicht-Funktions-Template oder einen eingeschränkten Template-Template-Parameter benennt, aber kein Member-Template, das Mitglied einer unbekannten Spezialisierung ist, und alle Template-Argumente in der einfachen Template-ID nicht-abhängig sind, müssen die assoziierten Constraints des eingeschränkten Templates erfüllt sein:

template<typename T>
concept C1 = sizeof(T) != sizeof(int);
template<C1 T>
struct S1 {};
template<C1 T>
using Ptr = T*;
S1<int>* p;                      // error: constraints not satisfied
Ptr<int> p;                      // error: constraints not satisfied
template<typename T>
struct S2 { Ptr<int> x; };       // error, no diagnostic required
template<typename T>
struct S3 { Ptr<T> x; };         // OK, satisfaction is not required
S3<int> x;                       // error: constraints not satisfied
template<template<C1 T> class X>
struct S4
{
    X<int> x;                    // error, no diagnostic required
};
template<typename T>
concept C2 = sizeof(T) == 1;
template<C2 T> struct S {};
template struct S<char[2]>;      // error: constraints not satisfied
template<> struct S<char[2]> {}; // error: constraints not satisfied
(seit C++20)

Wenn alle folgenden Bedingungen erfüllt sind, sind zwei Template-Identifikatoren gleich :

  • Ihre template-name s oder Operatoren beziehen sich auf dieselbe Vorlage.
  • Ihre entsprechenden Typtemplate-Argumente sind derselbe Typ.
  • Die durch ihre entsprechenden konstanten Template-Argumente bestimmten Template-Parameterwerte sind template-argument-equivalent .
  • Ihre entsprechenden Template-Template-Argumente beziehen sich auf dieselbe Vorlage.

Zwei Template-Bezeichner, die gleich sind, beziehen sich auf dieselbe Variable, (since C++14) Klasse oder Funktion.

Templatisierte Entität

Eine templated entity (oder in manchen Quellen "Temploid") ist jede Entität, die innerhalb einer Template-Definition definiert wird (oder für einen lambda expression erstellt) (seit C++11) wird. Alle folgenden sind templated entities:

  • eine Klasse/Funktion /Variable (seit C++14) Template
(seit C++20)
  • ein Mitglied einer templatisierten Entität (wie eine Nicht-Template-Memberfunktion einer Klassentemplate)
  • ein Enumerator einer Enumeration, die eine templatisierte Entität ist
  • jede Entität, die innerhalb einer templatisierten Entität definiert oder erstellt wird: eine lokale Klasse, eine lokale Variable, eine Friend-Funktion, etc
  • der Closure-Typ eines Lambda-Ausdrucks, der in der Deklaration einer templatisierten Entität erscheint
(since C++11)

Zum Beispiel, in

template<typename T>
struct A
{
    void f() {}
};

die Funktion A::f ist keine Funktionsvorlage, wird jedoch weiterhin als templatisiert betrachtet.


Eine templated function ist eine Funktionsvorlage oder eine Funktion, die templated ist.

Eine templated class ist eine Klassenvorlage oder eine Klasse, die templatiert ist.

Eine templated variable ist eine Variablenvorlage oder eine Variable, die templated ist.

(since C++14)

Schlüsselwörter

template , export

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
CWG 2293 C++98 Die Regeln zur Bestimmung, ob eine Template-Kennung
gültig ist, wurden nicht bereitgestellt
bereitgestellt
CWG 2682 C++98
C++14
Die Definitionen von templatisierten Funktionen/Template-Klassen
(C++98)/templatisierten Variablen (C++14) fehlten
hinzugefügt
P2308R1 C++98 Zwei Template-Kennungen waren unterschiedlich, wenn ihre
entsprechenden konstanten Template-Argumente
nicht template-argument-äquivalent sind
Sie sind unterschiedlich, wenn ihre entsprechenden
konstanten Template-Parameterwerte
nicht template-argument-äquivalent sind

Siehe auch

C-Dokumentation für Generic selection