![]() |
注意 |
---|---|
推荐的 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 结构化绑定进行反射,请定义为 |
BOOST_PFR_USE_LOOPHOLE |
如果您希望覆盖 Boost.PFR 的选择并利用 CWG 2118 进行反射,请定义为 |
BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE |
如果您遇到 |
BOOST_PFR_HAS_GUARANTEED_COPY_ELISION |
如果您的编译器未正确实现 C++17 保证的复制省略,并且无法反射具有不可移动字段的聚合类型,请定义为 |
BOOST_PFR_ENABLE_IMPLICIT_REFLECTION |
如果您因隐式反射做出许多无效选择而受到影响,请定义为 |
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 的反射有一些限制,这些限制取决于 C++ 标准和编译器功能
boost::pfr::get
、boost::pfr::structure_to_tuple
、boost::pfr::structure_tie
、boost::pfr::tuple_element
要求 T 必须是仅包含内置类型的 POD 类型。Boost.PFR 的字段名称提取有一些限制,这些限制取决于 C++ 标准和编译器功能
extern T t;
这样使用,即具有非内部链接。
BOOST_PFR_CORE_NAME_PARSING
已经为大多数流行的编译器设置好了。只有当库中的某些 static_assert
对 BOOST_PFR_CORE_NAME_PARSING
报错时,才需要调整它。
为此,请执行以下操作
test/core_name/print_name.cpp
并运行它(skip_at_begin, skip_at_end, "")
,其中skip_at_begin
等于输出中第一次出现 user_defined_field
之前的字符数skip_at_end
等于输出中最后一次出现 user_defined_field
之后的字符数test/core_name/print_name.cpp
是否返回 “user_defined_field”(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 = ")
从右侧搜索字符串中出现的位置BOOST_PFR_CORE_NAME_PARSING
宏的参数 以及 test/core_name/print_name.cpp
的初始输出。