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
TransformationTrait
operazione:
[Reflect.ops.enum] / 2
template <Enum T> struct get_enumerators
Tutte le specializzazioni di get_enumerators<T>
devono soddisfare i
TransformationTrait
requisiti (20.10.1). Il tipo annidato denominato
type
designa un tipo di meta oggetto soddisfacente
ObjectSequence
, contenente elementi che soddisfano Enumerator
e riflettono gli enumeratori del tipo di enumerazione riflessi da T
.
[Reflect.ops.objseq] della bozza copre le ObjectSequence
operazioni, dove in particolare [Reflect.ops.objseq] / 1 copre il get_size
tratto 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
UnaryTypeTrait
requisiti (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_v
e get_type_v
per 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.