反射 TS:枚举(和其他类型)的静态反射
Reflection TS,尤其是latest version of the Reflection TS draft的[reflect.ops.enum]/2提供get_enumeratorsTransformationTrait操作:
[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 特征,用于提取满足@987654336 的元对象的元素数量@:
[reflect.ops.objseq]/1
template <ObjectSequence T> struct get_size;
get_size<T> 的所有专业都应符合
UnaryTypeTrait 要求 (20.10.1) 具有基本特征
integral_constant<size_t, N>,其中N 是元素的数量
对象序列。
因此,在反射 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 在 2018 年 6 月 9 日 ISO C++ 委员会夏季会议上的 Trip report: Summer ISO C++ standards meeting (Rapperswil) 所述,Reflection TS 已被宣布为功能完备
Reflection TS 功能完备:Reflection TS 被宣布为功能完备,并将在夏季进行主要评论投票。再次注意,TS 当前基于模板元编程的语法只是一个占位符;所要求的反馈是关于设计的核心“胆量”,委员会已经知道它打算用更简单的编程模型替换表面语法,该模型使用普通的编译时代码,而不是<> 风格的元编程。
并且是 initially planed for C++20,但目前还不清楚 Reflection TS 是否仍有机会进入 C++20 版本。