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
TransformationTrait
operację:
[reflekt.ops.enum] / 2
template <Enum T> struct get_enumerators
Wszystkie specjalizacje get_enumerators<T>
powinny spełniać
TransformationTrait
wymagania (20.10.1). Zagnieżdżony typ o nazwie
type
wyznacza spełniający typ metaobiektu
ObjectSequence
, zawierający elementy, które spełniają Enumerator
i odzwierciedlają elementy wyliczające typu wyliczenia odzwierciedlone przez T
.
[reflekt.ops.objseq] projektu obejmuje ObjectSequence
operacje, gdzie w szczególności [reflekt.ops.objseq] / 1 obejmuje get_size
cechę 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ć
UnaryTypeTrait
wymagania (20.10.1) o charakterystyce bazowej
integral_constant<size_t, N>
, gdzie N
jest 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_v
i dodatkowo get_type_v
uproś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.