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.