Reflection TS: статичне відображення переліків (та інших типів)
Reflection TS , зокрема [Reflect.ops.enum] / 2 останньої версії проекту Reflection TS пропонує get_enumerators TransformationTraitоперацію:
[Reflect.ops.enum] / 2
template <Enum T> struct get_enumerators
Усі спеціалізації Росії get_enumerators<T>повинні відповідати
TransformationTraitвимогам (20.10.1). Вкладений тип з іменем typeпозначає тип
мета-об'єкта ObjectSequence, що задовольняє
, що містить елементи, які задовольняють Enumeratorі відображають перечислювачі типу перерахування, відображені T.
[Reflect.ops.objseq] проекту охоплює ObjectSequenceоперації, де зокрема [Reflect.ops.objseq] / 1 охоплює get_sizeознаку для вилучення кількості елементів для мета-об'єкта, що задовольняє ObjectSequence:
[Reflect.ops.objseq] / 1
template <ObjectSequence T> struct get_size;
Усі спеціалізації get_size<T>повинні відповідати
UnaryTypeTraitвимогам (20.10.1) з базовою характеристикою
integral_constant<size_t, N>, де N- кількість елементів у послідовності об'єктів.
Таким чином, у Reflection TS повинні були бути прийняті та реалізовані в поточній формі, кількість елементів перерахування можна обчислити під час компіляції, як показано нижче:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators<Example>::type;
static_assert(get_size<ExampleEnumerators>::value == 5U, "");
де ми, швидше за все, побачимо шаблони псевдонімів get_enumerators_vта ще get_type_vбільше спростимо відображення:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators_t<Example>;
static_assert(get_size_v<ExampleEnumerators> == 5U, "");
Статус на рефлексії TS
Як зазначено у звіті поїздки Herb Sutter : Літня зустріч стандартів ISO C ++ (Rapperswil) від літньої зустрічі комітету ISO C ++ 9 червня 2018 року, Reflection TS оголошено повноцінною
Reflection TS є повнофункціональним : Reflection TS було оголошено повнофункціональним і надсилається для голосування за основний коментар протягом літа. Ще раз зауважимо, що поточний синтаксис на основі метапрограмування шаблону TS - це просто заповнювач; запитуваний зворотний зв’язок стосується основних “кишок” проекту, і комітет уже знає, що має намір замінити поверхневий синтаксис на більш просту модель програмування, яка використовує звичайний код часу компіляції, а не <>метапрограмування у стилі.
і спочатку планувався для C ++ 20 , але дещо незрозуміло, чи все ще Reflection TS матиме шанс потрапити у випуск C ++ 20.