Überblick zu Typ-Trait-Funktionen (C++0x)

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Typ-Trait-Funktionen (C++0x) - Index

Appmethod C++ 2009 unterstützt eine Bibliothek mit Typ-Trait-Funktionen, die für die Verwendung von Metaprogrammiertechniken vorgesehen sind.

Diese Typ-Trait-Funktionen sind intrinsische Typfunktionen, die ähnlich wie typeid, sizeof und decltype definiert sind. Die Typ-Trait-Funktionen akzeptieren zur Compilierzeit einen Typ und liefern als Ergebnis einen Konstantenausdruck, normalerweise vom Typ bool.

Jede Typ-Trait-Funktion ist nach dem zu ihr passenden Typ-Trait benannt und wird mit vorangestellten doppelten Unterstrichen (__) versehen, was einen für die Implementierung reservierten Namen kennzeichnet.

Das folgende Beispiel zeigt eine Typ-Trait-Funktion, deren Auswertung True ergibt, wenn T ein Variantentyp ist, ansonsten False:

bool __is_union(typename T)

Das Schlüsselwort typename gibt hier eine Funktion an, die als Argument einen Typ und keinen Wert übernimmt (nur zu Demonstrationszwecken).

Unterschiede zwischen Typ-Trait-Funktionen und anderen intrinsischen Funktionen

Typ-Trait-Funktionen akzeptieren nur benannte Typen, keine beliebigen Ausdrücke (die von typeid, sizeof und decltype akzeptiert würden). Sie können bei Typ-Trait-Funktionen mehrere Argumente angeben, aber eine durch Komma getrennte Liste wird von typeid, sizeof und decltype als eine Anwendung des Kommaoperators interpretiert.

Ähnlich erzeugt der Versuch, den Typ eines Bit-Feldes zu referenzieren (wie mit decltype), den zugrunde liegenden Speichertyp für das Bit-Feld, und genau das wird in den Typ-Trait-Funktionen getestet.

Unvollständige Typen und Typ-Trait-Funktionen

Viele Typ-Trait-Funktionen arbeiten mit unvollständigen Typen. Nachdem eine Klasse beispielsweise als forward deklariert wurde, kann der Typ als eine Klasse, nicht als Variante, Aufzählung oder fundamentaler Typ identifiziert werden. Die Klasse kann Referenzen, Zeiger usw. haben. Deshalb akzeptieren Typ-Trait-Funktionen zwei spezielle unvollständige Typen: void und array-of-unknown-bound (von vollständigen Typen). Für diese beiden unvollständigen Typen geben die meisten Typ-Trait-Funktionen False zurück.

Für einige Typfunktionen sind aber vollständige Typen erforderlich. Eine Klassendeklaration reicht beispielsweise nicht aus, um Auskunft über Basen oder Trivialität zu geben.

Die folgende Typ-Trait-Funktion ist in Appmethod C++ implementiert:

__is_complete_type(T)

Das ist eine spezielle Typ-Trait-Funktion, weil sie unterschiedliche Ergebnisse zur Compilierzeit liefern könnte. Dies ist abhängig von ihrer Position in der Übersetzungseinheit. Dieses Phänomen macht diese Typ-Trait-Funktion anfällig für ODR-Verletzungen, wenn sie unvorsichtig verwendet wird.

Eine Tabelle mit Typ-Trait-Funktionen, die einen vollständigen Typ, ein Array-of-unknown-bound oder (potenziell cv-qualifiziert) void benötigen, finden Sie in Tabelle 43: “Type Property Predicates” in Abschnitt 20 des Working Draft.

Siehe auch