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
TransformationTrait
Anforderungen (20.10.1) entsprechen. Der verschachtelte Typ mit dem Namen
type
bezeichnet einen befriedigenden Metaobjekttyp
ObjectSequence
, der Elemente enthält, die Enumerator
die Aufzähler des Aufzählungstyps erfüllen und widerspiegeln T
.
[Reflect.ops.objseq] des Entwurfs behandelt ObjectSequence
Operationen, wobei insbesondere [Reflect.ops.objseq] / 1 das get_size
Merkmal 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 UnaryTypeTrait
Anforderungen (20.10.1) mit einer Basiseigenschaft
erfüllen
integral_constant<size_t, N>
, wobei N
die 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_v
und get_type_v
die 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.