Reflexión TS: reflexión estática de enumeraciones (y otros tipos)
Reflection TS , particularmente [reflect.ops.enum] / 2 de la última versión del borrador de Reflection TS ofrece la get_enumerators TransformationTraitoperación:
[reflect.ops.enum] / 2
template <Enum T> struct get_enumerators
Todas las especializaciones de get_enumerators<T>deben cumplir los
TransformationTraitrequisitos (20.10.1). El tipo anidado denominado
typedesigna un tipo de metaobjeto satisfactorio
ObjectSequence, que contiene elementos que satisfacen Enumeratory reflejan a los enumeradores del tipo de enumeración reflejado por T.
[reflect.ops.objseq] del borrador cubre ObjectSequenceoperaciones, donde particularmente [reflect.ops.objseq] / 1 cubre el get_sizerasgo para extraer el número de elementos para un metaobjeto que satisface ObjectSequence:
[reflect.ops.objseq] / 1
template <ObjectSequence T> struct get_size;
Todas las especializaciones de get_size<T>deben cumplir los
UnaryTypeTraitrequisitos (20.10.1) con una característica base de
integral_constant<size_t, N>, donde Nes el número de elementos en la secuencia del objeto.
Por lo tanto, en Reflection TS debían aceptarse e implementarse en su forma actual, el número de elementos de una enumeración se puede calcular, en tiempo de compilación, de la siguiente manera:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators<Example>::type;
static_assert(get_size<ExampleEnumerators>::value == 5U, "");
donde es probable que veamos plantillas de alias get_enumerators_vy get_type_vsimplifiquemos aún más la reflexión:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators_t<Example>;
static_assert(get_size_v<ExampleEnumerators> == 5U, "");
Estado en Reflection TS
Como se indica en el informe de viaje de Herb Sutter : Reunión de estándares ISO C ++ de verano (Rapperswil) de la reunión de verano del comité ISO C ++ del 9 de junio de 2018, Reflection TS ha sido declarado como completo
Reflection TS tiene características completas : Reflection TS se declaró con características completas y se enviará para su boleta de comentarios principal durante el verano. Tenga en cuenta nuevamente que la sintaxis basada en metaprogramación de la plantilla actual de TS es solo un marcador de posición; la retroalimentación solicitada está en las “entrañas” centrales del diseño, y el comité ya sabe que tiene la intención de reemplazar la sintaxis superficial con un modelo de programación más simple que usa código de tiempo de compilación común y <>metaprogramación no estilo.
e inicialmente se planeó para C ++ 20 , pero no está claro si Reflection TS aún tendrá la oportunidad de llegar a la versión de C ++ 20.