32

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;}};

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

4

1 回答 1

32

N3814 中概述了反射用例:

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

一般的观点是,我们将把它作为类型特征库的扩展来做,例如 N3815:

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

反思有两个部分。首先是内省。获取一个实体并查询它的常量值。第二个是物化,它是相反的——使用价值来创造新的实体。

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

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

内省方法目前有更多共识,具体化方面则更远。

于 2014-03-05T18:50:03.200 回答