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
TransformationTrait
operação:
[reflect.ops.enum] / 2
template <Enum T> struct get_enumerators
Todas as especializações de get_enumerators<T>
devem atender aos
TransformationTrait
requisitos (20.10.1). O tipo aninhado denominado type
designa um tipo de
meta-objeto satisfatório
ObjectSequence
, contendo elementos que satisfazem Enumerator
e refletem os enumeradores do tipo de enumeração refletido por T
.
[reflect.ops.objseq] do rascunho cobre as ObjectSequence
operações, onde particularmente [reflect.ops.objseq] / 1 cobre o get_size
traç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
UnaryTypeTrait
requisitos (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_v
e get_type_v
para 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.