Reflexão TS: reflexão estática de enums (e outros tipos)
O Reflection TS , particularmente [reflect.ops.enum] / 2 da versão mais recente do rascunho do Reflection TS oferece a get_enumerators TransformationTraitoperação:
[reflect.ops.enum] / 2
template <Enum T> struct get_enumerators
Todas as especializações de get_enumerators<T>devem atender aos
TransformationTraitrequisitos (20.10.1). O tipo aninhado denominado typedesigna um tipo de
meta-objeto satisfatório
ObjectSequence, contendo elementos que satisfazem Enumeratore refletem os enumeradores do tipo de enumeração refletido por T.
[reflect.ops.objseq] do rascunho cobre as ObjectSequenceoperações, onde particularmente [reflect.ops.objseq] / 1 cobre o get_sizetraço para extrair o número de elementos para um meta-objeto que satisfaça ObjectSequence:
[reflect.ops.objseq] / 1
template <ObjectSequence T> struct get_size;
Todas as especializações de get_size<T>devem atender aos
UnaryTypeTraitrequisitos (20.10.1) com uma característica base de
integral_constant<size_t, N>, onde Né o número de elementos na sequência de objetos.
Assim, no Reflection TS para ser aceito e implementado em sua forma atual, o número de elementos de um enum pode ser calculado, em tempo de compilação, da seguinte forma:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators<Example>::type;
static_assert(get_size<ExampleEnumerators>::value == 5U, "");
onde provavelmente veremos modelos de alias get_enumerators_ve get_type_vpara simplificar ainda mais a reflexão:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators_t<Example>;
static_assert(get_size_v<ExampleEnumerators> == 5U, "");
Status no Reflection TS
Conforme declarado pelo relatório de viagem de Herb Sutter : Reunião de padrões ISO C ++ de verão (Rapperswil) da reunião de verão do comitê ISO C ++ de 9 de junho de 2018, o Reflection TS foi declarado como recurso completo
O Reflection TS tem recursos completos : O Reflection TS foi declarado como recursos completos e está sendo enviado para sua votação principal de comentários durante o verão. Observe novamente que a sintaxe baseada em metaprogramação de template atual do TS é apenas um espaço reservado; o feedback que está sendo solicitado está nas “entranhas” centrais do projeto, e o comitê já sabe que pretende substituir a sintaxe de superfície por um modelo de programação mais simples que usa código de tempo de compilação comum e não <>metaprogramação no estilo.
e foi inicialmente planejado para C ++ 20 , mas não está claro se o Reflection TS ainda terá a chance de torná-lo no lançamento do C ++ 20.