Metaprogramming library (since C++11)
C++ fournit des facilités de métaprogrammation, telles que les traits de type, l'arithmétique rationnelle à la compilation et les séquences d'entiers à la compilation.
Table des matières
|
Définitions
Les types suivants sont collectivement appelés types référençables :
- types d'objets
- types de fonctions sans cv et ref
- types de références
Pour tout type référençable
T
, une référence vers celui-ci peut être créée
[1]
.
- ↑ Pour les types référence, cela peut être réalisé via reference collapsing .
Traits de type
Les traits de types définissent des interfaces basées sur des templates à la compilation pour interroger les propriétés des types.
Tenter de spécialiser un modèle défini dans l'en-tête <type_traits> et listé sur cette page entraîne un comportement indéfini, sauf que std::common_type et std::basic_common_reference (depuis C++20) peuvent être spécialisés comme requis dans la description.
Un modèle défini dans l' <type_traits> peut être instancié avec un type incomplet sauf indication contraire, nonobstant l'interdiction générale d'instancier les modèles de la bibliothèque standard avec des types incomplets.
Classes de base
La plupart des traits de type non transformateurs doivent être dérivés publiquement et sans ambiguïté de std::integral_constant afin de satisfaire aux exigences de UnaryTypeTrait ou BinaryTypeTrait .
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++11)
(C++17)
|
constante à la compilation du type spécifié avec la valeur spécifiée
(modèle de classe) |
Deux spécialisations de std::integral_constant pour le type bool sont fournies :
|
Défini dans l'en-tête
<type_traits>
|
|
| Type | Définition |
true_type
|
std:: integral_constant < bool , true > |
false_type
|
std:: integral_constant < bool , false > |
Traits de type unaires
Les traits de type unaires peuvent être utilisés pour interroger les propriétés booléennes d'un type à la compilation.
Tous ces traits de type satisfont UnaryTypeTrait , la caractéristique de base de chaque trait de type est soit std::true_type soit std::false_type , selon que la condition correspondante est remplie ou non.
Catégories de types primaires |
|
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++11)
|
vérifie si un type est
void
(modèle de classe) |
|
(C++11)
(
DR*
)
|
vérifie si un type est
std::nullptr_t
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type intégral
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type à virgule flottante
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type tableau
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type énumération
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type union
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type classe non-union
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type fonction
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type pointeur
(modèle de classe) |
|
(C++11)
|
vérifie si un type est une
lvalue reference
(modèle de classe) |
|
(C++11)
|
vérifie si un type est une
référence rvalue
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un pointeur vers un membre objet non-statique
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un pointeur vers une fonction membre non statique
(modèle de classe) |
Catégories de types composites |
|
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++11)
|
vérifie si un type est un type fondamental
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type arithmétique
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type scalaire
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type objet
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type composé
(modèle de classe) |
|
(C++11)
|
vérifie si un type est soit une
référence lvalue
soit une
référence rvalue
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un pointeur vers une fonction membre non statique ou un objet
(modèle de classe) |
Propriétés des types |
|
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++11)
|
vérifie si un type est qualifié const
(modèle de classe) |
|
(C++11)
|
vérifie si un type est qualifié volatile
(modèle de classe) |
|
(C++11)
(déprécié en C++26)
|
vérifie si un type est trivial
(modèle de classe) |
|
(C++11)
|
vérifie si un type est trivialement copiable
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type
standard-layout
(modèle de classe) |
|
(C++11)
(déprécié en C++20)
|
vérifie si un type est un type de données simples (POD)
(modèle de classe) |
|
(C++11)
(déprécié en C++17)
(supprimé en C++20)
|
vérifie si un type est un type littéral
(modèle de classe) |
|
vérifie si chaque bit dans la représentation objet du type contribue à sa valeur
(modèle de classe) |
|
|
(C++11)
|
vérifie si un type est un type classe (mais pas union) et n'a pas de membres de données non statiques
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type de classe polymorphe
(modèle de classe) |
|
(C++11)
|
vérifie si un type est une classe abstraite
(modèle de classe) |
|
(C++14)
|
vérifie si un type est un type de classe final
(modèle de classe) |
|
(C++17)
|
vérifie si un type est un type agrégé
(modèle de classe) |
|
(C++23)
|
vérifie si un type est un type à durée de vie implicite
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type arithmétique signé
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type arithmétique non signé
(modèle de classe) |
|
(C++20)
|
vérifie si un type est un type tableau de taille connue
(modèle de classe) |
|
(C++20)
|
vérifie si un type est un type tableau de taille inconnue
(modèle de classe) |
|
(C++23)
|
vérifie si un type est un type d'énumération délimitée
(modèle de classe) |
Opérations prises en charge |
|
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type possède un constructeur pour des arguments spécifiques
(modèle de classe) |
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type possède un constructeur par défaut
(modèle de classe) |
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type possède un constructeur de copie
(modèle de classe) |
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type peut être construit à partir d'une référence rvalue
(modèle de classe) |
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type possède un opérateur d'affectation pour un argument spécifique
(modèle de classe) |
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type possède un opérateur d'affectation par copie
(modèle de classe) |
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type possède un opérateur d'affectation par déplacement
(modèle de classe) |
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type possède un destructeur non supprimé
(modèle de classe) |
|
(C++11)
|
vérifie si un type possède un destructeur virtuel
(modèle de classe) |
|
(C++17)
(C++17)
(C++17)
(C++17)
|
vérifie si les objets d'un type peuvent être échangés avec des objets de même type ou de type différent
(modèle de classe) |
|
vérifie si une référence est liée à un temporaire lors d'une initialisation directe
(modèle de classe) |
|
|
vérifie si une référence est liée à un temporaire lors d'une initialisation par copie
(modèle de classe) |
|
Requêtes de propriétés
Les traits de requête de propriétés peuvent être utilisés pour interroger les propriétés intégrales d'un type au moment de la compilation.
Tous ces traits de type satisfont
UnaryTypeTrait
, la caractéristique de base de chaque trait de type est
std::
integral_constant
<
std::
size_t
, Value
>
, où
Value
est le résultat de la requête de la propriété correspondante.
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++11)
|
obtient les exigences d'alignement du type
(modèle de classe) |
|
(C++11)
|
obtient le nombre de dimensions d'un type tableau
(modèle de classe) |
|
(C++11)
|
obtient la taille d'un type tableau selon une dimension spécifiée
(modèle de classe) |
Relations entre types
Les traits de relation de types peuvent être utilisés pour interroger les relations entre les types au moment de la compilation.
Tous ces traits de type satisfont BinaryTypeTrait , la caractéristique de base de chaque trait de type est soit std::true_type soit std::false_type , selon que la condition correspondante est remplie.
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++11)
|
vérifie si deux types sont identiques
(modèle de classe) |
|
(C++11)
|
vérifie si un type est une base d'un autre type
(modèle de classe) |
|
(C++26)
|
vérifie si un type est une base virtuelle d'un autre type
(modèle de classe) |
|
(C++11)
(C++20)
|
vérifie si un type peut être converti en un autre type
(modèle de classe) |
|
(C++20)
|
vérifie si deux types sont
compatibles en disposition
(modèle de classe) |
|
vérifie si un type est une base
interconvertible par pointeur
(initiale) d'un autre type
(modèle de classe) |
|
|
vérifie si un type peut être invoqué (comme avec
std::invoke
) avec les types d'arguments donnés
(modèle de classe) |
|
Transformations de types
Les traits de transformation de type transforment un type en un autre suivant des règles prédéfinies.
Tous ces traits de type satisfont TransformationTrait .
Spécificateurs const-volatilité |
|
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++11)
(C++11)
(C++11)
|
supprime
const
et/ou
volatile
du type donné
(modèle de classe) |
|
(C++11)
(C++11)
(C++11)
|
ajoute
const
et/ou
volatile
au type donné
(modèle de classe) |
Références |
|
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++11)
|
supprime une référence du type donné
(modèle de classe) |
|
(C++11)
(C++11)
|
ajoute une référence
lvalue
ou
rvalue
au type donné
(modèle de classe) |
Modificateurs de signe |
|
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++11)
|
obtient le type signé correspondant pour le type intégral donné
(modèle de classe) |
|
(C++11)
|
obtient le type signé correspondant pour le type intégral donné
(modèle de classe) |
Tableaux |
|
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++11)
|
supprime une dimension du type de tableau donné
(modèle de classe) |
|
(C++11)
|
supprime toutes les dimensions du type tableau donné
(modèle de classe) |
Pointeurs |
|
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++11)
|
supprime un pointeur du type donné
(modèle de classe) |
|
(C++11)
|
ajoute un pointeur au type donné
(modèle de classe) |
Autres transformations |
|
|
Défini dans l'en-tête
<type_traits>
|
|
|
(depuis C++11)
(obsolète en C++23)
|
définit le type approprié pour une utilisation comme stockage non initialisé pour des types de taille donnée
(modèle de classe) |
|
(depuis C++11)
(obsolète en C++23)
|
définit le type approprié pour être utilisé comme stockage non initialisé pour tous les types donnés
(modèle de classe) |
|
(C++11)
|
applique les transformations de type comme lors du passage d'un argument de fonction par valeur
(modèle de classe) |
|
(C++20)
|
combine
std::remove_cv
et
std::remove_reference
(modèle de classe) |
|
(C++11)
|
supprime conditionnellement
une surcharge de fonction
ou une spécialisation de modèle de la résolution de surcharge
(modèle de classe) |
|
(C++11)
|
choisit un type ou un autre selon une condition booléenne à la compilation
(modèle de classe) |
|
(C++11)
|
détermine le type commun d'un groupe de types
(modèle de classe) |
|
détermine le type de référence commun d'un groupe de types
(modèle de classe) |
|
|
(C++11)
|
obtient le type entier sous-jacent pour un type d'énumération donné
(modèle de classe) |
|
(C++11)
(supprimé en C++20)
(C++17)
|
déduit le type de résultat de l'invocation d'un objet appelable avec un ensemble d'arguments
(modèle de classe) |
|
(C++17)
|
modèle d'alias variadique void
(modèle d'alias) |
|
(C++20)
|
retourne l'argument de type inchangé
(modèle de classe) |
Opérations logiques (depuis C++17)
Les traits d'opérateurs logiques appliquent des opérateurs logiques à d'autres traits de type.
|
Défini dans l'en-tête
<type_traits>
|
|
|
(C++17)
|
métafonction logique ET variadique
(modèle de classe) |
|
(C++17)
|
métafonction logique OU variadique
(modèle de classe) |
|
(C++17)
|
métafonction logique NON
(modèle de classe) |
Relations entre membres (depuis C++20)
|
Défini dans l'en-tête
<type_traits>
|
|
|
vérifie si les objets d'un type sont
pointer-interconvertible
avec le sous-objet spécifié de ce type
(modèle de fonction) |
|
|
(C++20)
|
vérifie si deux membres spécifiés correspondent l'un à l'autre dans la sous-séquence initiale commune de deux types spécifiés
(modèle de fonction) |
Arithmétique rationnelle à la compilation
L'en-tête <ratio> fournit des types et fonctions pour manipuler et stocker des ratios à la compilation .
Séquences d'entiers à la compilation (depuis C++14)
|
Défini dans l'en-tête
<utility>
|
|
|
(C++14)
|
implémente une séquence d'entiers à la compilation
(modèle de classe) |