Boost C++ 库

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

PrevUpHomeNext

限制与配置

[Caution] 注意

推荐的 C++ 标准是 C++20 及以上版本。C++17 对于不想访问结构体成员名称的用户来说完全足够。库至少需要 C++14!不支持 C++14 之前的编译器 (C++11, C++03...)。

Boost.PFR 库适用于满足 SimpleAggregate 要求的类型:没有基类的聚合类型、const 字段、引用或 C 数组

struct simple_aggregate {  // SimpleAggregate
    std::string name;
    int age;
    boost::uuids::uuid uuid;
};

struct empty {             // SimpleAggregate
};

struct aggregate : empty { // not a SimpleAggregate
    std::string name;
    int age;
    boost::uuids::uuid uuid;
};

该库可能适用于不满足 SimpleAggregate 要求的聚合类型,但其行为往往不具备可移植性。

Boost.PFR 的字段名称提取仅适用于 SimpleAggregate 类型。

配置宏

默认情况下,Boost.PFR 自动检测您的编译器能力,并自动将配置宏定义为适当的值。如果您希望覆盖此行为,只需定义

表 26.2. 宏

宏名称

作用

BOOST_PFR_USE_CPP17

如果您希望覆盖 Boost.PFR 的选择并使用 C++17 结构化绑定进行反射,请定义为 1。如果您希望覆盖 Boost.PFR 的选择并禁用 C++17 结构化绑定,请定义为 0

BOOST_PFR_USE_LOOPHOLE

如果您希望覆盖 Boost.PFR 的选择并利用 CWG 2118 进行反射,请定义为 1。如果您希望覆盖 Boost.PFR 的选择并禁用 CWG 2118,请定义为 0

BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE

如果您遇到 std::make_integer_sequence 的模板实例化深度问题,并希望使用 Boost.PFR 版本的元函数,请定义为 0。如果您希望覆盖 Boost.PFR 检测逻辑,请定义为 1

BOOST_PFR_HAS_GUARANTEED_COPY_ELISION

如果您的编译器未正确实现 C++17 保证的复制省略,并且无法反射具有不可移动字段的聚合类型,请定义为 0。如果您希望覆盖 Boost.PFR 检测逻辑,请定义为 1

BOOST_PFR_ENABLE_IMPLICIT_REFLECTION

如果您因隐式反射做出许多无效选择而受到影响,请定义为 0。如果您希望覆盖 Boost.PFR 检测逻辑,请定义为 1

BOOST_PFR_CORE_NAME_ENABLED

在不支持字段名称提取的平台上,'boost/pfr/config.hpp' 头文件将 BOOST_PFR_CORE_NAME_ENABLED 宏定义为 0。在包含头文件之前将此宏定义为 0 将禁用获取字段名称的能力。

BOOST_PFR_FUNCTION_SIGNATURE

对于已知的编译器,定义为编译器特定的宏,该宏输出整个函数签名,包括非类型模板参数。

BOOST_PFR_CORE_NAME_PARSING

描述从 BOOST_PFR_FUNCTION_SIGNATURE 宏中提取字段名称。详见下文。

BOOST_PFR_ENABLED

在不支持 Boost.PFR 的平台上,`boost/pfr/config.hpp` 头文件将 BOOST_PFR_ENABLED 宏定义为 0。在包含头文件之前将此宏定义为 0 将禁用 Boost.PFR 库。


限制详情

Boost.PFR 的反射有一些限制,这些限制取决于 C++ 标准和编译器功能

Boost.PFR 的字段名称提取有一些限制,这些限制取决于 C++ 标准和编译器功能

调整 BOOST_PFR_CORE_NAME_PARSING

BOOST_PFR_CORE_NAME_PARSING 已经为大多数流行的编译器设置好了。只有当库中的某些 static_assertBOOST_PFR_CORE_NAME_PARSING 报错时,才需要调整它。

为此,请执行以下操作

  1. 使用您的编译器构建 test/core_name/print_name.cpp 并运行它
  2. 将 BOOST_PFR_CORE_NAME_PARSING 定义为 (skip_at_begin, skip_at_end, ""),其中
    • skip_at_begin 等于输出中第一次出现 user_defined_field 之前的字符数
    • skip_at_end 等于输出中最后一次出现 user_defined_field 之后的字符数
  3. 检查 test/core_name/print_name.cpp 是否返回 “user_defined_field”
  4. 如果它没有返回 “user_defined_field”,则将 BOOST_PFR_CORE_NAME_PARSING 定义为 (skip_at_begin, skip_at_end, "T = "),其中
    • skip_at_begin 等于步骤 2 中的 skip_at_begin
    • skip_at_end 等于步骤 2 中的 skip_at_end
    • "T = " 等于输出中 user_defined_field 正前方的字符,使用 backward("T = ") 从右侧搜索字符串中出现的位置
  5. (可选,但强烈建议)创建 issue 工单,请求将您的编译器添加到受支持的编译器列表中。包括提供给 BOOST_PFR_CORE_NAME_PARSING 宏的参数 以及 test/core_name/print_name.cpp 的初始输出。

PrevUpHomeNext