Metaprogramming library (since C++11)
C++ bietet Metaprogrammierungsmöglichkeiten wie Type Traits, Compile-time Rational Arithmetic und Compile-time Integer Sequences.
Inhaltsverzeichnis |
Definitionen
Die folgenden Typen werden zusammen als referenceable types bezeichnet:
- Objekttypen
- Funktionstypen ohne cv und ref
- Referenztypen
Für jeden referenzierbaren Typ
T
kann eine Referenz darauf erstellt werden
[1]
.
- ↑ Für Referenztypen kann dies mittels Reference Collapsing erfolgen.
Type Traits
Type Traits definieren kompilierzeitliche, template-basierte Schnittstellen, um die Eigenschaften von Typen abzufragen.
Der Versuch, eine in der <type_traits> Header-Datei definierte und auf dieser Seite aufgeführte Vorlage zu spezialisieren, führt zu undefiniertem Verhalten, außer dass std::common_type und std::basic_common_reference (seit C++20) entsprechend der Beschreibung spezialisiert werden dürfen.
Eine Vorlage, die im <type_traits> Header definiert ist, kann mit einem unvollständigen Typ instanziiert werden, sofern nicht anders angegeben, ungeachtet des allgemeinen Verbots, Standardbibliotheksvorlagen mit unvollständigen Typen zu instanziieren.
Basisklassen
Die meisten nicht-transformierenden Typmerkmale müssen öffentlich und eindeutig von std::integral_constant abgeleitet werden, um die Anforderungen von UnaryTypeTrait oder BinaryTypeTrait zu erfüllen.
|
Definiert im Header
<type_traits>
|
|
|
(C++11)
(C++17)
|
Kompilierzeitkonstante des spezifizierten Typs mit spezifiziertem Wert
(Klassentemplate) |
Zwei Spezialisierungen von std::integral_constant für den Typ bool werden bereitgestellt:
|
Definiert im Header
<type_traits>
|
|
| Typ | Definition |
true_type
|
std:: integral_constant < bool , true > |
false_type
|
std:: integral_constant < bool , false > |
Unäre Typmerkmale
Unäre Typmerkmale können verwendet werden, um die booleschen Eigenschaften eines Typs zur Kompilierzeit abzufragen.
Alle diese Typ-Traits erfüllen UnaryTypeTrait , die Basiseigenschaft jedes Typ-Traits ist entweder std::true_type oder std::false_type , abhängig davon, ob die entsprechende Bedingung erfüllt ist.
Primäre Typkategorien |
|
|
Definiert im Header
<type_traits>
|
|
|
(C++11)
|
prüft, ob ein Typ
void
ist
(Klassentemplate) |
|
(C++11)
(
DR*
)
|
prüft, ob ein Typ
std::nullptr_t
ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein integraler Typ ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein Gleitkommatyp ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein Array-Typ ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein Aufzählungstyp ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein Union-Typ ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein Nicht-Union-Klassentyp ist
(Klassen-Template) |
|
(C++11)
|
prüft, ob ein Typ ein Funktionstyp ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein Zeigertyp ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein
lvalue reference
ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ eine
rvalue reference
ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein nicht-statisches Member-Objekt-Zeiger ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein nicht-statischer Member-Funktionszeiger ist
(Klassentemplate) |
Kategorien zusammengesetzter Typen |
|
|
Definiert im Header
<type_traits>
|
|
|
(C++11)
|
prüft, ob ein Typ ein fundamentaler Typ ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein arithmetischer Typ ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein skalarer Typ ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein Objekttyp ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein zusammengesetzter Typ ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ entweder ein
lvalue reference
oder
rvalue reference
ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein Zeiger auf eine nicht-statische Member-Funktion oder ein nicht-statisches Member-Objekt ist
(Klassen-Template) |
Typeigenschaften |
|
|
Definiert im Header
<type_traits>
|
|
|
(C++11)
|
prüft, ob ein Typ const-qualifiziert ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ volatile-qualifiziert ist
(Klassentemplate) |
|
(C++11)
(veraltet in C++26)
|
prüft, ob ein Typ trivial ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ trivial kopierbar ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein
Standard-layout
Typ ist
(Klassentemplate) |
|
(C++11)
(veraltet in C++20)
|
prüft, ob ein Typ ein Plain-Old-Data (POD) Typ ist
(Klassentemplate) |
|
(C++11)
(deprecated in C++17)
(removed in C++20)
|
prüft, ob ein Typ ein Literaltyp ist
(Klassentemplate) |
|
prüft, ob jedes Bit in der Objektdarstellung des Typs zu seinem Wert beiträgt
(Klassentemplate) |
|
|
(C++11)
|
prüft, ob ein Typ ein Klassentyp (aber kein Union-Typ) ist und keine nicht-statischen Datenelemente besitzt
(Klassen-Template) |
|
(C++11)
|
prüft, ob ein Typ ein polymorpher Klassentyp ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein abstrakter Klassentyp ist
(Klassentemplate) |
|
(C++14)
|
prüft, ob ein Typ ein finaler Klassentyp ist
(Klassentemplate) |
|
(C++17)
|
prüft, ob ein Typ ein Aggregat-Typ ist
(Klassentemplate) |
|
(C++23)
|
prüft, ob ein Typ ein Implicit-Lifetime-Typ ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein vorzeichenbehafteter arithmetischer Typ ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein vorzeichenloser arithmetischer Typ ist
(Klassentemplate) |
|
(C++20)
|
prüft, ob ein Typ ein Array-Typ mit bekannter Größe ist
(Klassentemplate) |
|
(C++20)
|
prüft, ob ein Typ ein Array-Typ unbekannter Größe ist
(Klassentemplate) |
|
(C++23)
|
prüft, ob ein Typ ein scoped enumeration type ist
(Klassentemplate) |
Unterstützte Operationen |
|
|
Definiert im Header
<type_traits>
|
|
|
(C++11)
(C++11)
(C++11)
|
prüft, ob ein Typ einen Konstruktor für bestimmte Argumente besitzt
(Klassentemplate) |
|
(C++11)
(C++11)
(C++11)
|
prüft, ob ein Typ einen Standardkonstruktor besitzt
(Klassentemplate) |
|
(C++11)
(C++11)
(C++11)
|
prüft, ob ein Typ einen Kopierkonstruktor besitzt
(Klassentemplate) |
|
(C++11)
(C++11)
(C++11)
|
prüft, ob ein Typ aus einem Rvalue-Referenz konstruiert werden kann
(Klassentemplate) |
|
(C++11)
(C++11)
(C++11)
|
prüft, ob ein Typ einen Zuweisungsoperator für ein bestimmtes Argument besitzt
(Klassentemplate) |
|
(C++11)
(C++11)
(C++11)
|
prüft, ob ein Typ einen Kopierzuweisungsoperator besitzt
(Klassentemplate) |
|
(C++11)
(C++11)
(C++11)
|
prüft, ob ein Typ einen Move-Zuweisungsoperator besitzt
(Klassentemplate) |
|
(C++11)
(C++11)
(C++11)
|
prüft, ob ein Typ einen nicht gelöschten Destruktor besitzt
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ einen virtuellen Destruktor besitzt
(Klassentemplate) |
|
(C++17)
(C++17)
(C++17)
(C++17)
|
prüft, ob Objekte eines Typs mit Objekten desselben oder eines anderen Typs ausgetauscht werden können
(Klassentemplate) |
|
prüft, ob eine Referenz in der Direktinitialisierung an ein temporäres Objekt gebunden wird
(Klassentemplate) |
|
|
prüft, ob eine Referenz in der Kopierinitialisierung an ein temporäres Objekt gebunden wird
(Klassentemplate) |
|
Eigenschaftsabfragen
Property-Abfragetraits können verwendet werden, um die integralen Eigenschaften eines Typs zur Kompilierzeit abzufragen.
Alle diese Typ-Traits erfüllen
UnaryTypeTrait
, die Basiseigenschaft jedes Typ-Traits ist
std::
integral_constant
<
std::
size_t
, Value
>
, wobei
Value
das Abfrageergebnis der entsprechenden Eigenschaft ist.
|
Definiert im Header
<type_traits>
|
|
|
(C++11)
|
ermittelt die Ausrichtungsanforderungen eines Typs
(Klassentemplate) |
|
(C++11)
|
ermittelt die Anzahl der Dimensionen eines Array-Typs
(Klassentemplate) |
|
(C++11)
|
ermittelt die Größe eines Array-Typs entlang einer bestimmten Dimension
(Klassentemplate) |
Typbeziehungen
Typbeziehungstraits können verwendet werden, um Beziehungen zwischen Typen zur Kompilierzeit abzufragen.
Alle diese Typ-Traits erfüllen BinaryTypeTrait , die Basiseigenschaft jedes Typ-Traits ist entweder std::true_type oder std::false_type , abhängig davon, ob die entsprechende Bedingung erfüllt ist.
|
Definiert im Header
<type_traits>
|
|
|
(C++11)
|
prüft, ob zwei Typen identisch sind
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ eine Basis eines anderen Typs ist
(Klassentemplate) |
|
(C++26)
|
prüft, ob ein Typ eine virtuelle Basis eines anderen Typs ist
(Klassentemplate) |
|
(C++11)
(C++20)
|
prüft, ob ein Typ in einen anderen Typ konvertiert werden kann
(Klassentemplate) |
|
(C++20)
|
prüft, ob zwei Typen
layout-kompatibel
sind
(Klassentemplate) |
|
prüft, ob ein Typ eine
zeigerinterkonvertierbare
(initiale) Basis eines anderen Typs ist
(Klassentemplate) |
|
|
prüft, ob ein Typ (wie durch
std::invoke
) mit den gegebenen Argumenttypen aufgerufen werden kann
(Klassentemplate) |
|
Typumwandlungen
Typ-Transformationstraits transformieren einen Typ in einen anderen gemäß vordefinierter Regeln.
All diese Type-Traits erfüllen TransformationTrait .
Const-Volatilitäts-Spezifizierer |
|
|
Definiert im Header
<type_traits>
|
|
|
(C++11)
(C++11)
(C++11)
|
entfernt
const
und/oder
volatile
Spezifizierer vom gegebenen Typ
(Klassentemplate) |
|
(C++11)
(C++11)
(C++11)
|
fügt
const
und/oder
volatile
Spezifizierer zum gegebenen Typ hinzu
(Klassentemplate) |
Referenzen |
|
|
Definiert im Header
<type_traits>
|
|
|
(C++11)
|
entfernt eine Referenz vom gegebenen Typ
(Klassentemplate) |
|
(C++11)
(C++11)
|
fügt einen
lvalue
- oder
rvalue
-Referenztyp zum gegebenen Typ hinzu
(Klassentemplate) |
Vorzeichenmodifikatoren |
|
|
Definiert im Header
<type_traits>
|
|
|
(C++11)
|
Ermittelt den entsprechenden vorzeichenbehafteten Typ für den gegebenen Ganzzahltyp
(Klassentemplate) |
|
(C++11)
|
Ermittelt den entsprechenden vorzeichenbehafteten Typ für den gegebenen Ganzzahltyp
(Klassentemplate) |
Arrays |
|
|
Definiert im Header
<type_traits>
|
|
|
(C++11)
|
entfernt eine Dimension vom gegebenen Array-Typ
(Klassen-Template) |
|
(C++11)
|
entfernt alle Dimensionen vom gegebenen Array-Typ
(Klassen-Template) |
Zeiger |
|
|
Definiert im Header
<type_traits>
|
|
|
(C++11)
|
entfernt einen Zeiger vom gegebenen Typ
(Klassentemplate) |
|
(C++11)
|
fügt einen Zeiger zum gegebenen Typ hinzu
(Klassentemplate) |
Weitere Transformationen |
|
|
Definiert im Header
<type_traits>
|
|
|
(seit C++11)
(veraltet in C++23)
|
definiert den Typ, der als nicht initialisierter Speicher für Typen gegebener Größe geeignet ist
(Klassentemplate) |
|
(since C++11)
(deprecated in C++23)
|
definiert den Typ, der als nicht initialisierter Speicher für alle gegebenen Typen geeignet ist
(Klassen-Template) |
|
(C++11)
|
wendet Typumwandlungen an, wie beim Übergeben eines Funktionsarguments als Wert
(Klassentemplate) |
|
(C++20)
|
kombiniert
std::remove_cv
und
std::remove_reference
(Klassentemplate) |
|
(C++11)
|
entfernt
bedingt
eine Funktionsüberladung oder Template-Spezialisierung aus der Überladungsauflösung
(Klassen-Template) |
|
(C++11)
|
wählt einen von zwei Typen basierend auf einem Compile-time-Boolean aus
(Klassentemplate) |
|
(C++11)
|
bestimmt den gemeinsamen Typ einer Gruppe von Typen
(Klassentemplate) |
|
bestimmt den gemeinsamen Referenztyp einer Gruppe von Typen
(Klassentemplate) |
|
|
(C++11)
|
Ermittelt den zugrundeliegenden Ganzzahltyp für einen gegebenen Aufzählungstyp
(Klassentemplate) |
|
(C++11)
(entfernt in C++20)
(C++17)
|
leitet den Ergebnistyp des Aufrufs eines aufrufbaren Objekts mit einer Menge von Argumenten ab
(Klassentemplate) |
|
(C++17)
|
void variadische Alias-Vorlage
(Alias-Vorlage) |
|
(C++20)
|
gibt den Typ-Parameter unverändert zurück
(Klassentemplate) |
Logische Operationen (since C++17)
Logische Operatoren-Traits wenden logische Operatoren auf andere Typ-Traits an.
|
Definiert im Header
<type_traits>
|
|
|
(C++17)
|
variadische logische UND-Metafunktion
(Klassentemplate) |
|
(C++17)
|
variadische logische ODER-Metafunktion
(Klassentemplate) |
|
(C++17)
|
logische NICHT-Metafunktion
(Klassentemplate) |
Member-Beziehungen (seit C++20)
|
Definiert im Header
<type_traits>
|
|
|
prüft, ob Objekte eines Typs
pointer-interconvertible
mit dem spezifizierten Unterobjekt dieses Typs sind
(Funktions-Template) |
|
|
(C++20)
|
prüft, ob zwei spezifizierte Member einander in der gemeinsamen initialen Teilsequenz zweier spezifizierter Typen entsprechen
(Funktions-Template) |
Compile-time-Rationalarithmetik
Der Header <ratio> stellt Typen und Funktionen zur Manipulation und Speicherung von Compile-Time-Verhältnissen bereit .
Compile-Time-Integer-Sequenzen (seit C++14)
|
Definiert im Header
<utility>
|
|
|
(C++14)
|
implementiert eine Compile-Zeit-Sequenz von Ganzzahlen
(Klassentemplate) |