Namespaces
Variants

Metaprogramming library (since C++11)

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences

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:

Für jeden referenzierbaren Typ T kann eine Referenz darauf erstellt werden [1] .

  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>
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)
prüft, ob ein Typ ein integraler Typ ist
(Klassentemplate)
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)
prüft, ob ein Typ ein Funktionstyp ist
(Klassentemplate)
(C++11)
prüft, ob ein Typ ein Zeigertyp ist
(Klassentemplate)
prüft, ob ein Typ ein lvalue reference ist
(Klassentemplate)
prüft, ob ein Typ eine rvalue reference ist
(Klassentemplate)
prüft, ob ein Typ ein nicht-statisches Member-Objekt-Zeiger ist
(Klassentemplate)
prüft, ob ein Typ ein nicht-statischer Member-Funktionszeiger ist
(Klassentemplate)
Kategorien zusammengesetzter Typen
Definiert im Header <type_traits>
prüft, ob ein Typ ein fundamentaler Typ ist
(Klassentemplate)
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)
prüft, ob ein Typ ein zusammengesetzter Typ ist
(Klassentemplate)
prüft, ob ein Typ entweder ein lvalue reference oder rvalue reference ist
(Klassentemplate)
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)
prüft, ob ein Typ volatile-qualifiziert ist
(Klassentemplate)
(C++11) (veraltet in C++26)
prüft, ob ein Typ trivial ist
(Klassentemplate)
prüft, ob ein Typ trivial kopierbar ist
(Klassentemplate)
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)
prüft, ob ein Typ ein polymorpher Klassentyp ist
(Klassentemplate)
prüft, ob ein Typ ein abstrakter Klassentyp ist
(Klassentemplate)
(C++14)
prüft, ob ein Typ ein finaler Klassentyp ist
(Klassentemplate)
prüft, ob ein Typ ein Aggregat-Typ ist
(Klassentemplate)
prüft, ob ein Typ ein Implicit-Lifetime-Typ ist
(Klassentemplate)
(C++11)
prüft, ob ein Typ ein vorzeichenbehafteter arithmetischer Typ ist
(Klassentemplate)
prüft, ob ein Typ ein vorzeichenloser arithmetischer Typ ist
(Klassentemplate)
prüft, ob ein Typ ein Array-Typ mit bekannter Größe ist
(Klassentemplate)
prüft, ob ein Typ ein Array-Typ unbekannter Größe ist
(Klassentemplate)
prüft, ob ein Typ ein scoped enumeration type ist
(Klassentemplate)
Unterstützte Operationen
Definiert im Header <type_traits>
prüft, ob ein Typ einen Konstruktor für bestimmte Argumente besitzt
(Klassentemplate)
prüft, ob ein Typ einen Standardkonstruktor besitzt
(Klassentemplate)
prüft, ob ein Typ einen Kopierkonstruktor besitzt
(Klassentemplate)
prüft, ob ein Typ aus einem Rvalue-Referenz konstruiert werden kann
(Klassentemplate)
prüft, ob ein Typ einen Zuweisungsoperator für ein bestimmtes Argument besitzt
(Klassentemplate)
prüft, ob ein Typ einen Kopierzuweisungsoperator besitzt
(Klassentemplate)
prüft, ob ein Typ einen Move-Zuweisungsoperator besitzt
(Klassentemplate)
prüft, ob ein Typ einen nicht gelöschten Destruktor besitzt
(Klassentemplate)
prüft, ob ein Typ einen virtuellen Destruktor besitzt
(Klassentemplate)
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>
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)
prüft, ob ein Typ eine virtuelle Basis eines anderen Typs ist
(Klassentemplate)
prüft, ob ein Typ in einen anderen Typ konvertiert werden kann
(Klassentemplate)
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>
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>
entfernt eine Referenz vom gegebenen Typ
(Klassentemplate)
fügt einen lvalue - oder rvalue -Referenztyp zum gegebenen Typ hinzu
(Klassentemplate)
Vorzeichenmodifikatoren
Definiert im Header <type_traits>
Ermittelt den entsprechenden vorzeichenbehafteten Typ für den gegebenen Ganzzahltyp
(Klassentemplate)
Ermittelt den entsprechenden vorzeichenbehafteten Typ für den gegebenen Ganzzahltyp
(Klassentemplate)
Arrays
Definiert im Header <type_traits>
entfernt eine Dimension vom gegebenen Array-Typ
(Klassen-Template)
entfernt alle Dimensionen vom gegebenen Array-Typ
(Klassen-Template)
Zeiger
Definiert im Header <type_traits>
entfernt einen Zeiger vom gegebenen Typ
(Klassentemplate)
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)
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)
wählt einen von zwei Typen basierend auf einem Compile-time-Boolean aus
(Klassentemplate)
bestimmt den gemeinsamen Typ einer Gruppe von Typen
(Klassentemplate)
bestimmt den gemeinsamen Referenztyp einer Gruppe von Typen
(Klassentemplate)
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)
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>
variadische logische UND-Metafunktion
(Klassentemplate)
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)
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>
implementiert eine Compile-Zeit-Sequenz von Ganzzahlen
(Klassentemplate)