Reflection TS : réflexion statique des enums (et autres types)
Réflexion TS en particulier [reflect.ops.enum]/2 de l'interface utilisateur. dernière version du projet Reflection TS offre le get_enumerators
TransformationTrait
fonctionnement :
[reflect.ops.enum]/2
template <Enum T> struct get_enumerators
Toutes les spécialisations de get_enumerators<T>
doit respecter les TransformationTrait
(20.10.1). Le type imbriqué nommé type
désigne un type de méta-objet répondant aux critères suivants ObjectSequence
contenant des éléments qui satisfont Enumerator
et reflètent les énumérateurs du type d'énumération reflété par T
.
[reflect.ops.objseq] de l'ébauche couvre ObjectSequence
où, en particulier, [reflect.ops.objseq]/1 couvre la get_size
trait pour l'extraction du nombre d'éléments pour un méta-objet satisfaisant ObjectSequence
:
[reflect.ops.objseq]/1
template <ObjectSequence T> struct get_size;
Toutes les spécialisations de get_size<T>
doit respecter les UnaryTypeTrait
(20.10.1) dont la caractéristique de base est integral_constant<size_t, N>
donde N
est le nombre d'éléments dans la séquence d'objets.
Ainsi, si Reflection TS devait être accepté et mis en œuvre dans sa forme actuelle, le nombre d'éléments d'un enum peut être calculé, au moment de la compilation, comme suit :
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators<Example>::type;
static_assert(get_size<ExampleEnumerators>::value == 5U, "");
où nous sommes susceptibles de voir des modèles d'alias get_enumerators_v
y get_type_v
pour simplifier davantage la réflexion :
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators_t<Example>;
static_assert(get_size_v<ExampleEnumerators> == 5U, "");
État d'avancement de la réflexion TS
Comme indiqué par Herb Sutter Rapport de voyage : Réunion d'été de l'ISO sur les normes C++ (Rapperswil) à la suite de la réunion d'été du comité ISO C++ du 9 juin 2018, Reflection TS a été déclaré comme étant une fonctionnalité complète.
Reflection TS est complet en termes de fonctionnalités : La TS Reflection a été déclarée feature-complete et est envoyée pour son principal vote de commentaires au cours de l'été. Notez une fois de plus que le modèle actuel de syntaxe basé sur la métaprogrammation de la TS n'est qu'un substitut ; les commentaires demandés portent sur les " entrailles " de la conception, et le comité sait déjà qu'il a l'intention de remplacer la syntaxe de surface par un modèle de programmation plus simple qui utilise le code ordinaire de compilation et non pas le langage de programmation. <>
-de la métaprogrammation.
et était initialement prévu pour C++20 Mais il n'est pas certain que Reflection TS ait encore une chance de figurer dans la version C++20.