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

时间:2014-03-05 18:41:03

标签: 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;}};

如果它不如此强大,那么典型的用例是什么?

1 个答案:

答案 0 :(得分: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)来创建类型。

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