Reflection TS: статическое отражение перечислений (и других типов)
Reflection TS , в частности [Reflection.ops.enum] / 2 последней версии проекта Reflection TS, предлагает следующие get_enumerators TransformationTraitоперации:
[think.ops.enum] / 2
template <Enum T> struct get_enumerators
Все специализации get_enumerators<T>должны соответствовать
TransformationTraitтребованиям (20.10.1). Вложенный тип с именем
typeобозначает удовлетворяющий тип мета-объекта
ObjectSequence, содержащий элементы, которые удовлетворяют Enumeratorи отражают перечислители типа перечисления, отраженного T.
[Reflect.ops.objseq] черновика охватывает ObjectSequenceоперации, где, в частности, [detect.ops.objseq] / 1 охватывает типаж get_sizeдля извлечения количества элементов для мета-объекта, удовлетворяющего ObjectSequence:
[reflection.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, "");
Статус на Reflection TS
Как указано в отчете о поездке Херба Саттера : Летнее собрание стандартов ISO C ++ (Rapperswil) на летнем заседании комитета ISO C ++ 9 июня 2018 г., Reflection TS был объявлен полностью функциональным.
Reflection TS является полнофункциональным : Reflection TS был объявлен полнофункциональным и разослан для голосования по основным комментариям в течение лета. Заметим еще раз, что текущий синтаксис, основанный на метапрограммировании шаблона TS, является просто заполнителем; запрашиваемая обратная связь находится в основе проекта, и комитет уже знает, что намеревается заменить поверхностный синтаксис более простой моделью программирования, которая использует обычный код времени компиляции, а не <>метапрограммирование в нестандартном стиле.
и изначально планировался для C ++ 20 , но несколько неясно, будет ли у Reflection TS еще шанс попасть в выпуск C ++ 20.