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
TransformationTrait
operación:
[reflect.ops.enum] / 2
template <Enum T> struct get_enumerators
Todas las especializaciones de get_enumerators<T>
deben cumplir los
TransformationTrait
requisitos (20.10.1). El tipo anidado denominado
type
designa un tipo de metaobjeto satisfactorio
ObjectSequence
, que contiene elementos que satisfacen Enumerator
y reflejan a los enumeradores del tipo de enumeración reflejado por T
.
[reflect.ops.objseq] del borrador cubre ObjectSequence
operaciones, donde particularmente [reflect.ops.objseq] / 1 cubre el get_size
rasgo 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
UnaryTypeTrait
requisitos (20.10.1) con una característica base de
integral_constant<size_t, N>
, donde N
es 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_v
y get_type_v
simplifiquemos 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.