Reflection TS: riflessione statica di enumerazioni (e altri tipi)
Reflection TS , in particolare [reflection.ops.enum] / 2 dell'ultima versione della bozza di Reflection TS, offre l' get_enumerators TransformationTraitoperazione:
[Reflect.ops.enum] / 2
template <Enum T> struct get_enumerators
Tutte le specializzazioni di get_enumerators<T>devono soddisfare i
TransformationTraitrequisiti (20.10.1). Il tipo annidato denominato
typedesigna un tipo di meta oggetto soddisfacente
ObjectSequence, contenente elementi che soddisfano Enumeratore riflettono gli enumeratori del tipo di enumerazione riflessi da T.
[Reflect.ops.objseq] della bozza copre le ObjectSequenceoperazioni, dove in particolare [Reflect.ops.objseq] / 1 copre il get_sizetratto per estrarre il numero di elementi per un meta oggetto soddisfacente ObjectSequence:
[Reflect.ops.objseq] / 1
template <ObjectSequence T> struct get_size;
Tutte le specializzazioni di get_size<T>devono soddisfare i
UnaryTypeTraitrequisiti (20.10.1) con una caratteristica di base di
integral_constant<size_t, N>, dove Nè il numero di elementi nella sequenza di oggetti.
Pertanto, in Reflection TS doveva essere accettato e implementato nella sua forma attuale, il numero di elementi di un enum può essere calcolato, in fase di compilazione, come segue:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators<Example>::type;
static_assert(get_size<ExampleEnumerators>::value == 5U, "");
dove è probabile che vedremo modelli di alias get_enumerators_ve get_type_vper semplificare ulteriormente la riflessione:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators_t<Example>;
static_assert(get_size_v<ExampleEnumerators> == 5U, "");
Stato su Reflection TS
Come affermato dal rapporto di viaggio di Herb Sutter : Riunione estiva degli standard ISO C ++ (Rapperswil) dalla riunione estiva del comitato ISO C ++ del 9 giugno 2018, Reflection TS è stato dichiarato completo di funzionalità
Reflection TS è completo di funzionalità : Reflection TS è stato dichiarato completo di funzionalità e verrà inviato per il suo voto di commento principale durante l'estate. Notare ancora che l'attuale sintassi basata sulla metaprogrammazione del modello di TS è solo un segnaposto; il feedback richiesto è sul cuore del progetto, e il comitato sa già che intende sostituire la sintassi superficiale con un modello di programmazione più semplice che utilizza il codice ordinario in fase di compilazione e non la <>metaprogrammazione in stile.
ed era inizialmente progettato per C ++ 20 , ma non è chiaro se Reflection TS avrà ancora la possibilità di entrare nella versione C ++ 20.