Metaprogrammierungsbibliothek (seit C++11)
C++ bietet Metaprogrammierfunktionen wie Typmerkmale, rationale Arithmetik zur Compilezeit und Ganzzahlsequenzen zur Compilezeit.
Inhalt
|
[bearbeiten] Definitionen
Die folgenden Typen werden kollektiv als referenzierbare Typen bezeichnet
- Objekttypen
- Funktionstypen ohne cv und ref
- Referenztypen
Für jeden referenzierbaren Typ T kann eine Referenz darauf erstellt werden[1].
- ↑ Bei Referenztypen kann dies über Referenzkollaps geschehen.
[bearbeiten] Typmerkmale
Typmerkmale definieren schnittstellenbasierte Abfragen auf Typ-Eigenschaften zur Compilezeit.
Der Versuch, eine Vorlage zu spezialisieren, die in der Kopfdatei <type_traits> definiert und auf dieser Seite aufgeführt ist, führt zu undefiniertem Verhalten, mit der Ausnahme, dass std::common_type und std::basic_common_reference(seit C++20) gemäß Beschreibung spezialisiert werden darf.
Eine in der Kopfdatei <type_traits> definierte Vorlage kann mit einem unvollständigen Typ instanziiert werden, sofern nicht anders angegeben, ungeachtet des allgemeinen Verbots, Standardbibliotheksvorlagen mit unvollständigen Typen zu instanziieren.
[bearbeiten] Basisklassen
Die meisten nicht-transformierenden Typmerkmale müssen öffentlich und eindeutig von std::integral_constant abgeleitet sein, um die Anforderungen von UnaryTypeTrait oder BinaryTypeTrait zu erfüllen.
| Definiert in der Kopfdatei
<type_traits> | |
| (C++11)(C++17) |
konstantes zur Compilezeit vom angegebenen Typ mit angegebenem Wert (Klassenvorlage) |
Zwei Spezialisierungen von std::integral_constant für den Typ bool werden bereitgestellt
| Definiert in der Kopfdatei
<type_traits> | |
| Typ | Definition |
true_type
|
std::integral_constant<bool, true> |
false_type
|
std::integral_constant<bool, false> |
[bearbeiten] Unäre Typmerkmale
Unäre Typmerkmale können verwendet werden, um boolesche Eigenschaften eines Typs zur Compilezeit abzufragen.
Alle diese Typmerkmale erfüllen UnaryTypeTrait, die Basischarakteristik jedes Typmerkmals ist entweder std::true_type oder std::false_type, abhängig davon, ob die entsprechende Bedingung erfüllt ist.
Primäre Typkategorien | |
| Definiert in der Kopfdatei
<type_traits> | |
| (C++11) |
prüft, ob ein Typ void ist (Klassenvorlage) |
| (C++11)(DR*) |
prüft, ob ein Typ std::nullptr_t ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein ganzzahliger Typ ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Fließkommatyp ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Arraytyp ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Aufzählungstyp ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Union-Typ ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Nicht-Union-Klassentyp ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Funktionstyp ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Zeigertyp ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ eine lvalue-Referenz ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ eine rvalue-Referenz ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Zeiger auf ein nicht-statisches Member-Objekt ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Zeiger auf eine nicht-statische Memberfunktion ist (Klassenvorlage) |
Zusammengesetzte Typkategorien | |
| Definiert in der Kopfdatei
<type_traits> | |
| (C++11) |
prüft, ob ein Typ ein fundamentaler Typ ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein arithmetischer Typ ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Skalartyp ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Objekttyp ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein zusammengesetzter Typ ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ entweder eine lvalue-Referenz oder eine rvalue-Referenz ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Zeiger auf eine nicht-statische Memberfunktion oder ein Objekt ist (Klassenvorlage) |
Typeneigenschaften | |
| Definiert in der Kopfdatei
<type_traits> | |
| (C++11) |
prüft, ob ein Typ const-qualifiziert ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ volatile-qualifiziert ist (Klassenvorlage) |
| (C++11)(veraltet in C++26) |
prüft, ob ein Typ trivial ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ trivial kopierbar ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Standardlayout-Typ ist (Klassenvorlage) |
| (C++11)(veraltet in C++20) |
prüft, ob ein Typ ein Plain-Old-Data (POD)-Typ ist (Klassenvorlage) |
| (C++11)(in C++17 veraltet)(in C++20 entfernt) |
prüft, ob ein Typ ein Literal-Typ ist (Klassenvorlage) |
| prüft, ob jedes Bit in der Objekt-Repräsentation des Typs zu seinem Wert beiträgt (Klassenvorlage) | |
| (C++11) |
prüft, ob ein Typ ein Klassentyp (aber keine Union) ist und keine nicht-statischen Datenelemente hat (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein polymorpher Klassentyp ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein abstrakter Klassentyp ist (Klassenvorlage) |
| (C++14) |
prüft, ob ein Typ ein finaler Klassentyp ist (Klassenvorlage) |
| (C++17) |
prüft, ob ein Typ ein Aggregattyp ist (Klassenvorlage) |
| (C++23) |
prüft, ob ein Typ ein impliziter Lebenszeit-Typ ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein vorzeichenbehafteter arithmetischer Typ ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein vorzeichenloser arithmetischer Typ ist (Klassenvorlage) |
| (C++20) |
prüft, ob ein Typ ein Arraytyp mit bekannter Grenze ist (Klassenvorlage) |
| (C++20) |
prüft, ob ein Typ ein Arraytyp mit unbekannter Grenze ist (Klassenvorlage) |
| (C++23) |
prüft, ob ein Typ ein namensgebender Aufzählungstyp ist (Klassenvorlage) |
Unterstützte Operationen | |
| Definiert in der Kopfdatei
<type_traits> | |
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ einen Konstruktor für spezifische Argumente hat (Klassenvorlage) |
| prüft, ob ein Typ einen Standardkonstruktor hat (Klassenvorlage) | |
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ einen Kopierkonstruktor hat (Klassenvorlage) |
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ aus einer rvalue-Referenz konstruiert werden kann (Klassenvorlage) |
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ einen Zuweisungsoperator für ein bestimmtes Argument hat (Klassenvorlage) |
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ einen Kopierzuweisungsoperator hat (Klassenvorlage) |
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ einen Verschiebezuweisungsoperator hat (Klassenvorlage) |
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ einen nicht-gelöschten Destruktor hat (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ einen virtuellen Destruktor hat (Klassenvorlage) |
| (C++17)(C++17)(C++17)(C++17) |
prüft, ob Objekte eines Typs mit Objekten desselben oder eines anderen Typs vertauscht werden können (Klassenvorlage) |
| prüft, ob eine Referenz in der direkten Initialisierung an ein temporäres Objekt gebunden wird (Klassenvorlage) | |
| prüft, ob eine Referenz in der Kopierinitialisierung an ein temporäres Objekt gebunden wird (Klassenvorlage) | |
[bearbeiten] Eigenschaftsabfragen
Eigenschaftsabfrage-Merkmale können verwendet werden, um ganzzahlige Eigenschaften eines Typs zur Compilezeit abzufragen.
Alle diese Typmerkmale erfüllen UnaryTypeTrait, die Basischarakteristik jedes Typmerkmals ist std::integral_constant<std::size_t, Value>, wobei Value das Abfrageergebnis der entsprechenden Eigenschaft ist.
| Definiert in der Kopfdatei
<type_traits> | |
| (C++11) |
erhält die Ausrichtungsvoraussetzungen des Typs (Klassenvorlage) |
| (C++11) |
erhält die Anzahl der Dimensionen eines Arraytyps (Klassenvorlage) |
| (C++11) |
erhält die Größe eines Arraytyps entlang einer bestimmten Dimension (Klassenvorlage) |
[bearbeiten] Typbeziehungen
Typbeziehungsmerkmale können verwendet werden, um Beziehungen zwischen Typen zur Compilezeit abzufragen.
Alle diese Typmerkmale erfüllen BinaryTypeTrait, die Basischarakteristik jedes Typmerkmals ist entweder std::true_type oder std::false_type, abhängig davon, ob die entsprechende Bedingung erfüllt ist.
| Definiert in der Kopfdatei
<type_traits> | |
| (C++11) |
prüft, ob zwei Typen gleich sind (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ eine Basisklasse des anderen Typs ist (Klassenvorlage) |
| (C++26) |
prüft, ob ein Typ eine virtuelle Basisklasse des anderen Typs ist (Klassenvorlage) |
| (C++11)(C++20) |
prüft, ob ein Typ in den anderen Typ konvertierbar ist (Klassenvorlage) |
| (C++20) |
prüft, ob zwei Typen Layout-kompatibel sind (Klassenvorlage) |
| prüft, ob ein Typ eine Zeiger-interkonvertierbare (initiale) Basisklasse eines anderen Typs ist (Klassenvorlage) | |
| prüft, ob ein Typ mit den gegebenen Argumenttypen aufgerufen werden kann (als ob durch std::invoke) (Klassenvorlage) | |
[bearbeiten] Typentransformationen
Typtransformation-Merkmale transformieren einen Typ gemäß vordefinierten Regeln in einen anderen.
Alle diese Typ-Traits erfüllen TransformationTrait.
Konst-Volatilität-Spezifizierer | |
| Definiert in der Kopfdatei
<type_traits> | |
| (C++11)(C++11)(C++11) |
entfernt const und/oder volatile Spezifizierer vom gegebenen Typ (Klassenvorlage) |
| (C++11)(C++11)(C++11) |
fügt const und/oder volatile Spezifizierer zum gegebenen Typ hinzu (Klassenvorlage) |
Referenzen | |
| Definiert in der Kopfdatei
<type_traits> | |
| (C++11) |
entfernt eine Referenz vom gegebenen Typ (Klassenvorlage) |
| (C++11)(C++11) |
fügt eine lvalue- oder rvalue-Referenz zum gegebenen Typ hinzu (Klassenvorlage) |
Vorzeichen-Modifikatoren | |
| Definiert in der Kopfdatei
<type_traits> | |
| (C++11) |
erhält den entsprechenden vorzeichenbehafteten Typ für den gegebenen ganzzahligen Typ (Klassenvorlage) |
| (C++11) |
erhält den entsprechenden vorzeichenbehafteten Typ für den gegebenen ganzzahligen Typ (Klassenvorlage) |
Arrays | |
| Definiert in der Kopfdatei
<type_traits> | |
| (C++11) |
entfernt eine Ausdehnung vom gegebenen Array-Typ (Klassenvorlage) |
| (C++11) |
entfernt alle Ausdehnungen vom gegebenen Array-Typ (Klassenvorlage) |
Zeiger | |
| Definiert in der Kopfdatei
<type_traits> | |
| (C++11) |
entfernt einen Zeiger vom gegebenen Typ (Klassenvorlage) |
| (C++11) |
fügt einen Zeiger zum gegebenen Typ hinzu (Klassenvorlage) |
Weitere Transformationen | |
| Definiert in der Kopfdatei
<type_traits> | |
| (seit C++11)(veraltet in C++23) |
definiert den Typ, der als uninitialisierter Speicher für Typen gegebener Größe geeignet ist (Klassenvorlage) |
| (seit C++11)(veraltet in C++23) |
definiert den Typ, der als uninitialisierter Speicher für alle gegebenen Typen geeignet ist (Klassenvorlage) |
| (C++11) |
wendet Typ-Transformationen an, wie beim Übergeben eines Funktionsarguments per Wert (Klassenvorlage) |
| (C++20) |
kombiniert std::remove_cv und std::remove_reference (Klassenvorlage) |
| (C++11) |
entfernt bedingt eine Funktionsüberladung oder Template-Spezialisierung aus der Überladungsauflösung (Klassenvorlage) |
| (C++11) |
wählt basierend auf einem booleschen Wert zur Kompilierzeit einen Typ oder einen anderen (Klassenvorlage) |
| (C++11) |
ermittelt den gemeinsamen Typ einer Gruppe von Typen (Klassenvorlage) |
| ermittelt den gemeinsamen Referenztyp einer Gruppe von Typen (Klassenvorlage) | |
| (C++11) |
erhält den zugrundeliegenden ganzzahligen Typ für einen gegebenen Aufzählungstyp (Klassenvorlage) |
| (C++11)(entfernt in C++20)(C++17) |
leitet den Ergebnistyp der Invokation eines aufrufbaren Objekts mit einer Reihe von Argumenten ab (Klassenvorlage) |
| (C++17) |
void variadische Alias-Vorlage (Alias-Vorlage) |
| (C++20) |
gibt das Typargument unverändert zurück (Klassenvorlage) |
[bearbeiten] Logische Operationen (seit C++17)
Logische Operator-Traits wenden logische Operatoren auf andere Typ-Traits an.
| Definiert in der Kopfdatei
<type_traits> | |
| (C++17) |
variadische logische AND-Metafunktion (Klassenvorlage) |
| (C++17) |
variadische logische OR-Metafunktion (Klassenvorlage) |
| (C++17) |
logische NOT-Metafunktion (Klassenvorlage) |
[bearbeiten] Mitgliedsbeziehungen (seit C++20)
| Definiert in der Kopfdatei
<type_traits> | |
| prüft, ob Objekte eines Typs zeigerinterkonvertierbar mit dem angegebenen Unterobjekt dieses Typs sind (Funktionsvorlage) | |
| (C++20) |
prüft, ob zwei angegebene Mitglieder in der gemeinsamen anfänglichen Teilsequenz zweier angegebener Typen übereinstimmen (Funktionsvorlage) |
[bearbeiten] Compile-time rationale Arithmetik
Die Header-Datei <ratio> stellt Typen und Funktionen zur Manipulation und Speicherung von Kompilierzeit-Verhältnissen bereit.
[bearbeiten] Compile-time Ganzzahlsequenzen (seit C++14)
| Definiert in der Header-Datei
<utility> | |
| (C++14) |
implementiert eine Compile-time-Sequenz von ganzen Zahlen (Klassenvorlage) |