ISO/IEC TS 23619:2021
Information technology - C++ extensions for reflection
发布时间:2021-10-11 实施时间:


C++是一种静态类型语言,其类型信息在编译时就已经确定。这意味着在运行时,程序无法获取类型信息,也无法动态地创建、修改或删除类、函数、变量等。这在某些情况下会限制程序的灵活性和可扩展性。例如,如果需要在运行时动态地加载和卸载插件,或者需要实现一些通用的序列化和反序列化功能,就需要反射功能。

ISO/IEC TS 23619:2021定义了一组新的语言特性和库函数,使得C++程序能够在运行时获取和操作程序结构信息。其中最重要的特性是类型反射。类型反射允许程序在运行时获取类型信息,包括类的名称、成员变量和成员函数的名称、类型和访问权限等。例如,以下代码演示了如何使用类型反射获取类的名称和成员变量的名称和类型:

```c++
include
include

struct Foo {
int x;
double y;
};

int main() {
std::cout << "Class name: " << std::reflexpr(Foo)::name << std::l;
std::cout << "Member variables:" << std::l;
std::cout << " " << std::reflexpr(Foo)::data_members::get<0>::name << " (" << std::reflexpr(Foo)::data_members::get<0>::type::name << ")" << std::l;
std::cout << " " << std::reflexpr(Foo)::data_members::get<1>::name << " (" << std::reflexpr(Foo)::data_members::get<1>::type::name << ")" << std::l;
return 0;
}
```

输出结果为:

```
Class name: Foo
Member variables:
x (int)
y (double)
```

除了类型反射,ISO/IEC TS 23619:2021还定义了一些其他的反射功能,包括函数反射、变量反射、命名空间反射等。此外,该标准还定义了一些库函数,用于在运行时创建、修改和删除类、函数、变量等。这些库函数包括std::make_reflected、std::reflect、std::reflect_member、std::reflect_namespace等。

需要注意的是,ISO/IEC TS 23619:2021是一项C++标准的扩展,不是标准的一部分。因此,不是所有的C++编译器都支持该标准。目前,只有部分编译器支持该标准,包括GCC、Clang和MSVC等。

相关标准
- ISO/IEC 14882:2020 Programming languages -- C++
- ISO/IEC TS 19571:2016 C++ Extensions for Library Fundamentals
- ISO/IEC TS 21425:2017 C++ Extensions for Parallelism
- ISO/IEC TS 21448:2017 C++ Extensions for Concepts