Reflexion TS: statische Reflexion von Aufzählungen (und anderen Typen)
Reflection TS , insbesondere [Reflect.ops.enum] / 2 der neuesten Version des Reflection TS-Entwurfs, bietet folgende Möglichkeiten get_enumerators TransformationTrait:
[Reflect.ops.enum] / 2
template <Enum T> struct get_enumerators
Alle Spezialisierungen von get_enumerators<T>müssen den
TransformationTraitAnforderungen (20.10.1) entsprechen. Der verschachtelte Typ mit dem Namen
typebezeichnet einen befriedigenden Metaobjekttyp
ObjectSequence, der Elemente enthält, die Enumeratordie Aufzähler des Aufzählungstyps erfüllen und widerspiegeln T.
[Reflect.ops.objseq] des Entwurfs behandelt ObjectSequenceOperationen, wobei insbesondere [Reflect.ops.objseq] / 1 das get_sizeMerkmal zum Extrahieren der Anzahl von Elementen für ein Metaobjekt abdeckt , das Folgendes erfüllt ObjectSequence:
[Reflect.ops.objseq] / 1
template <ObjectSequence T> struct get_size;
Alle Spezialisierungen von get_size<T>müssen die UnaryTypeTraitAnforderungen (20.10.1) mit einer Basiseigenschaft
erfüllen
integral_constant<size_t, N>, wobei Ndie Anzahl der Elemente in der Objektsequenz ist.
Wenn also in Reflection TS akzeptiert und in seiner aktuellen Form implementiert werden soll, kann die Anzahl der Elemente einer Aufzählung zur Kompilierungszeit wie folgt berechnet werden:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators<Example>::type;
static_assert(get_size<ExampleEnumerators>::value == 5U, "");
wo wir wahrscheinlich Alias-Vorlagen sehen get_enumerators_vund get_type_vdie Reflexion weiter vereinfachen:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators_t<Example>;
static_assert(get_size_v<ExampleEnumerators> == 5U, "");
Status bei Reflexion TS
Wie im Reisebericht von Herb Sutter angegeben : Sommer-ISO-C ++ - Standardtreffen (Rapperswil) vom Sommertreffen des ISO-C ++ - Komitees am 9. Juni 2018 wurde Reflection TS als vollständig erklärt
Reflection TS ist vollständig : Der Reflection TS wurde für vollständig erklärt und wird im Sommer für seine Hauptkommentarabstimmung verschickt. Beachten Sie erneut, dass die aktuelle Metaprogrammierungs-basierte Syntax des TS nur ein Platzhalter ist. Das angeforderte Feedback bezieht sich auf den Kern des Entwurfs, und das Komitee weiß bereits, dass es beabsichtigt, die Oberflächensyntax durch ein einfacheres Programmiermodell zu ersetzen, das gewöhnlichen Code zur Kompilierungszeit und keine <>Metaprogrammierung im Stil verwendet.
und war ursprünglich für C ++ 20 geplant , aber es ist etwas unklar, ob Reflection TS noch die Chance hat, es in die C ++ 20-Version zu schaffen.