一、反射的TS规范
Technical specifications,技术规范。反射的技术规范从c++14才逐渐清晰起来(Experimental Feature The functionality described on this page is part of the Reflection Technical Specification ISO/IEC TS 23619 (reflection TS).)。这里事先需要说明的是,这些只是规范,不是标准,所以包括在前面提到的c++26中的反射一样,都非常可能不断的变化。之所以变化还是要说明一下,主要是为了让大家有一个反射发展的历程。
在目前的规范中,使用reflexpr关键字做为反射的操作关键字。它定义在<experimental/reflect>,需要引用命名空间 std::experimental::reflect或者定义内联空间std::experimental::reflect::v1。
二、反射的规范
1、反射的操作数
reflexpr的反射的操作数可以是类型、命名空间、枚举、变量、数据成员、函数的形参、被捕获实体、 函数(包括普通函数、Lambada表达式、仿函数或相关函数式类型转过来的表达式。比如可以使用reflexpr(:😃 反射全局命名空间。
反射的关系是自反和传递的,但是非对称的(这个需要一些离散数学的知识)。
2、反射的内容
反射的内容,即reflexpr的对象必须是元数据类型,如果后面的反射对象为仿函数,那么此类中含有自定义的转换函数,则会发生错误。这个也比较好理解,其实就是定义了类似于别名的函数。比如常见的"using func = void(int)(char)"之类。
3、反射的库支持
反射的库支持主要有元对象和原生的支持,前者开发者可能都比较用得多,比如类似于一些常见的is系列“is_noexcept,is_scoped_enum”等等。而原生的概念支持则包括前面提到的“Object,Named,Typed”等等。此处不再赘述。
更多的规范,大家可以自行查阅相关的规范文档。
三、例程
因为这只是一个规范,所以就直接用规范中的例程来说明:
#include <string>
#include <vector>