C++ 1z中的编译时反射?

Vin*_*ent 32 c++ reflection standard-library c++17

C++标准化委员会中有一个研究小组,在C++ 1z或之后提供编译时反射.我想知道预期工具的目的是什么以及功能有多强大?

例如,是否可以使用这些工具命名函数或类?

struct A {int f() {return 42;}};
struct B {int (std::reflect<A>::member<0>::declname)() {return 43;}};
// equivalent to struct B {int f() {return 43;}};
Run Code Online (Sandbox Code Playgroud)

如果它没有这个那么强大,那么典型的用例是什么?

And*_*zos 32

N3814概述了反思用例:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3814.html

一般的观点是,我们将把它作为Type Traits库的扩展,如N3815所示:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3815.html

反思有两个部分.首先是内省.获取实体并查询有关它的常量值.第二个是具体化,相反 - 使用值来创建新实体.

对于内省 - 您可以期待额外的特征,这些特征将允许您在编译时枚举并获取类成员,基类,枚举器,函数参数等的名称.从那里,您可以将它们用于序列化,成员操作,静态检查和各种其他事情.

此外,我们稍后将讨论具体化,这将涉及从常量值创建新实体,其表达性比使用模板更具表现力.所以也许你可以填写一个std::class_specifier s结构然后调用make_type_from_spec(s)来创建类型.

内省方法目前有更多共识,具体化方面更进一步.