Présentation des fonctions trait de type (C++11)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Fonctions trait de type (C++11) - Index

C++Builder 2009 supporte une bibliothèque de fonctions trait de type désignées pour supporter les techniques de métaprogrammation à la compilation.

Ces fonctions trait de type sont des fonctions de type intrinsèques qui sont définies d'une manière similaire à typeid, sizeof et decltype. Les fonctions trait de type acceptent un type à la compilation et délivrent une expression constante de compilation en tant que résultat, généralement de type bool.

Chaque fonction trait de type est nommée après son trait de type respectif, préfixé d'un double caractère de soulignement (__), qui marque un nom réservé à l'implémentation.

Par exemple, le code suivant illustre une fonction trait de type qui est évaluée à True si T est un type union, ou False sinon :

bool __is_union(typename T)

Le mot clé typename indique ici une fonction qui prend un type plutôt qu'une valeur en argument, à des fins d'illustration uniquement.

Différences entre les fonctions trait de type et les autres fonctions intrinsèques

Les fonctions trait de type acceptent seulement les types nommés, et pas les expressions arbitraires (qui sont acceptées par typeid, sizeof et decltype). Vous pouvez spécifier plusieurs arguments avec une fonction trait de type, mais une liste séparée par des virgules est interprétée comme une application de l'opérateur virgule par typeid, sizeof et decltype.

De même, toute tentative de référencer le type d'un champ de bits (comme à travers decltype) produit le type de stockage sous-jacent pour le champ de bits, et c'est ce qui est testé dans les fonctions trait de type.

Fonctions trait de type et types incomplets

La plupart des fonctions trait de type ne fonctionnent pas avec les types incomplets. Par exemple, après qu'une classe ait été déclarée forward, le type peut être identifié comme une classe, pas une union, énumération ou type fondamental. La classe peut avoir des références et pointeurs, et ainsi de suite. Par conséquent, la plupart des fonctions trait de type acceptent deux types incomplets spéciaux : void et array-of-unknown-bound (de types complets). Pour ces deux types incomplets, la plupart des fonctions trait de type renvoient False.

Toutefois, quelques fonctions de type nécessitent des types complets. Par exemple, une déclaration de classe n'est pas suffisante pour connaître les bases ou la trivialité.

Par souci de commodité, la fonction trait de type suivante est implémentée dans C++Builder :

__is_complete_type(T)

Cette fonction trait de type est unique dans le sens où elle peut renvoyer différents résultats à la compilation en fonction de son emplacement dans l'unité de traduction. Des violations ODR peuvent survenir si vous utilisez cette fonction trait de type avec négligence.

Un tableau de fonctions trait de type qui requièrent que le type soit un type complet, un tableau de dimension inconnue ou (potentiellement cv-qualifié) void est donné dans Table 43 : "Type Property Predicates" dans la section 20 de Working Draft.

Voir aussi