简短描述
- 在编译时:使用聚合初始化来检测用户提供的结构中的字段计数
-
BOOST_PFR_USE_CPP17 == 1:
- 在编译时:结构化绑定用于将类型
T
分解为已知数量的字段
-
BOOST_PFR_USE_CPP17 == 0 && BOOST_PFR_USE_LOOPHOLE == 1:
- 在编译时:使用聚合初始化来检测用户提供的结构中的字段计数
- 在编译时:创建一个可以转换为任何类型的结构,并记住在用户提供的结构的聚合初始化期间已转换成的类型
- 在编译时:使用前几个步骤的知识,创建一个元组,其布局与用户提供的结构完全相同
- 在编译时:使用前一步骤中的元组查找用户提供的结构中每个字段的偏移量
- 在运行时:获取指向每个字段的指针,知道结构地址和每个字段偏移量
- 在运行时:返回字段引用的元组 => 所有元组方法都可用于该结构
-
BOOST_PFR_USE_CPP17 == 0 && BOOST_PFR_USE_LOOPHOLE == 0:
- 在编译时:令
I
为当前字段的索引,它等于 0
-
在运行时:构造 T
,并使用可转换为任何类型的结构的单独实例聚合初始化字段 I
![[Note]](../../../doc/src/images/note.png) |
注意 |
已采取额外措施以确保编译器可以使用关于 T 的所有信息,并且对 T 的操作没有副作用,因此编译器可以优化掉不必要的临时对象。 |
- 在编译时:
I += 1
- 在编译时:如果
I
不等于字段计数,则从可转换为任何类型的结构的转换运算符内部跳转到步骤 c.
- 在编译时:使用前几个步骤的知识,创建一个元组,其布局与用户提供的结构完全相同
- 在编译时:使用前一步骤中的元组查找用户提供的结构中每个字段的偏移量
- 在运行时:获取指向每个字段的指针,知道结构地址和每个字段偏移量
- 在运行时:返回字段引用的元组 => 所有元组方法都可用于该结构
一些基础知识的详细描述:Antony Polukhin: Better C++14 reflections。关于 C++14 基础知识的详细描述,使用 BOOST_PFR_USE_LOOPHOLE == 0:Antony Polukhin: C++14 Reflections Without Macros, Markup nor External Tooling。发明者 Alexandr Poltavsky 在他的博客中描述了 BOOST_PFR_USE_LOOPHOLE == 1 技术。
- 在编译时
- 在
constexpr
函数中获取类型为 T
的对象的成员引用
- 将之前的引用作为模板参数传递给具有
template <auto member_ptr>
的 constexpr
函数。该函数返回 __PRETTY_FUNCTION__
或其他一些特定于供应商的宏,这些宏打印函数的完整名称以及模板参数。
- 前一步骤返回的值包含成员名称(godbolt 示例)。对该值进行一些编译器特定的解析,并创建一个仅包含成员名称的
std::string_view
。
- 在运行时:返回带有成员名称的
std::string_view
。