Reflection TS: statyczne odbicie wyliczeń (i innych typów)
Reflection TS , w szczególności [Reflection TS.enum] / 2 najnowszej wersji szkicu Reflection TS oferuje get_enumerators TransformationTraitoperację:
[reflekt.ops.enum] / 2
template <Enum T> struct get_enumerators
Wszystkie specjalizacje get_enumerators<T>powinny spełniać
TransformationTraitwymagania (20.10.1). Zagnieżdżony typ o nazwie
typewyznacza spełniający typ metaobiektu
ObjectSequence, zawierający elementy, które spełniają Enumeratori odzwierciedlają elementy wyliczające typu wyliczenia odzwierciedlone przez T.
[reflekt.ops.objseq] projektu obejmuje ObjectSequenceoperacje, gdzie w szczególności [reflekt.ops.objseq] / 1 obejmuje get_sizecechę wyodrębniania liczby elementów dla meta-obiektu spełniającego ObjectSequence:
[reflekt.ops.objseq] / 1
template <ObjectSequence T> struct get_size;
Wszystkie specjalizacje get_size<T>muszą spełniać
UnaryTypeTraitwymagania (20.10.1) o charakterystyce bazowej
integral_constant<size_t, N>, gdzie Njest liczbą elementów w ciągu obiektowym.
W związku z tym w Reflection TS miało zostać zaakceptowane i zaimplementowane w obecnej formie, liczbę elementów wyliczenia można obliczyć w czasie kompilacji w następujący sposób:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators<Example>::type;
static_assert(get_size<ExampleEnumerators>::value == 5U, "");
gdzie prawdopodobnie zobaczymy szablony aliasów get_enumerators_vi dodatkowo get_type_vuprościmy refleksję:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators_t<Example>;
static_assert(get_size_v<ExampleEnumerators> == 5U, "");
Stan na Reflection TS
Jak stwierdzono w raporcie z podróży Herb Suttera : Letnie spotkanie norm ISO C ++ (Rapperswil) z letniego posiedzenia komisji ISO C ++ 9 czerwca 2018 r., Reflection TS zostało uznane za kompletne
Reflection TS jest kompletne pod względem funkcji : Reflection TS został uznany za kompletny i zostanie wysłany do głównego głosowania na komentarze w lecie. Zauważ ponownie, że obecna składnia TS oparta na metaprogramowaniu jest tylko symbolem zastępczym; informacja zwrotna, o którą proszono, dotyczy podstawowych „wnętrzności” projektu, a komisja już wie, że zamierza zastąpić składnię powierzchni prostszym modelem programowania, który wykorzystuje zwykły kod czasu kompilacji i <>metaprogramowanie w innym stylu.
i był początkowo planowany dla C ++ 20 , ale jest trochę niejasne, czy Reflection TS nadal będzie miało szansę na pojawienie się w wersji C ++ 20.