Boost C++ 库

...世界上最受推崇和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

工作原理

字段计数检测和获取成员引用

简短描述

  1. 在编译时:使用聚合初始化来检测用户提供的结构中的字段计数
    • BOOST_PFR_USE_CPP17 == 1:
      1. 在编译时:结构化绑定用于将类型 T 分解为已知数量的字段
    • BOOST_PFR_USE_CPP17 == 0 && BOOST_PFR_USE_LOOPHOLE == 1:
      1. 在编译时:使用聚合初始化来检测用户提供的结构中的字段计数
      2. 在编译时:创建一个可以转换为任何类型的结构,并记住在用户提供的结构的聚合初始化期间已转换成的类型
      3. 在编译时:使用前几个步骤的知识,创建一个元组,其布局与用户提供的结构完全相同
      4. 在编译时:使用前一步骤中的元组查找用户提供的结构中每个字段的偏移量
      5. 在运行时:获取指向每个字段的指针,知道结构地址和每个字段偏移量
      6. 在运行时:返回字段引用的元组 => 所有元组方法都可用于该结构
    • BOOST_PFR_USE_CPP17 == 0 && BOOST_PFR_USE_LOOPHOLE == 0:
      1. 在编译时:令 I 为当前字段的索引,它等于 0
      2. 在运行时:构造 T,并使用可转换为任何类型的结构的单独实例聚合初始化字段 I

        [Note] 注意

        已采取额外措施以确保编译器可以使用关于 T 的所有信息,并且对 T 的操作没有副作用,因此编译器可以优化掉不必要的临时对象。

      3. 在编译时:I += 1
      4. 在编译时:如果 I 不等于字段计数,则从可转换为任何类型的结构的转换运算符内部跳转到步骤 c.
      5. 在编译时:使用前几个步骤的知识,创建一个元组,其布局与用户提供的结构完全相同
      6. 在编译时:使用前一步骤中的元组查找用户提供的结构中每个字段的偏移量
      7. 在运行时:获取指向每个字段的指针,知道结构地址和每个字段偏移量
  2. 在运行时:返回字段引用的元组 => 所有元组方法都可用于该结构

一些基础知识的详细描述:Antony Polukhin: Better C++14 reflections。关于 C++14 基础知识的详细描述,使用 BOOST_PFR_USE_LOOPHOLE == 0Antony Polukhin: C++14 Reflections Without Macros, Markup nor External Tooling。发明者 Alexandr Poltavsky 在他的博客中描述了 BOOST_PFR_USE_LOOPHOLE == 1 技术。

字段名称检索

  1. 在编译时
    • constexpr 函数中获取类型为 T 的对象的成员引用
    • 将之前的引用作为模板参数传递给具有 template <auto member_ptr>constexpr 函数。该函数返回 __PRETTY_FUNCTION__ 或其他一些特定于供应商的宏,这些宏打印函数的完整名称以及模板参数。
    • 前一步骤返回的值包含成员名称(godbolt 示例)。对该值进行一些编译器特定的解析,并创建一个仅包含成员名称的 std::string_view
  2. 在运行时:返回带有成员名称的 std::string_view

PrevUpHomeNext