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.