用C++1z编译时反射

Compile-time reflection in C++1z?

本文关键字:反射 编译 C++1z      更新时间:2023-10-16

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

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

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)来创建类型。

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