在Boost 1.84中(目前正在进行中):
大的新功能:字段名称反射。添加了新的constexpr boost::pfr::get_name<N, T>()函数,它返回一个std::string_view,其中包含聚合类型T中索引为N的字段的名称。需要C++20。
使用GitHub上的最新版本pfr,您可以编写如下代码:
这个怎么工作的?这篇博客文章解释了如何重新利用聚合初始化来获取字段,但是获取字段名字似乎像是魔法!但是我在最新的三个编译器(最新的Visual C++,gcc 13.2,clang 16)上得到了上面的输出。看着core_name20_static.hpp中的代码,我也没明白多少。
大的新功能:字段名称反射。添加了新的constexpr boost::pfr::get_name<N, T>()函数,它返回一个std::string_view,其中包含聚合类型T中索引为N的字段的名称。需要C++20。
使用GitHub上的最新版本pfr,您可以编写如下代码:
#include <boost/pfr/core.hpp>
#include <boost/pfr/core_name.hpp>
struct S
{
int i = 1;
double d = 2;
std::string s = "three";
};
const S s;
constexpr auto names = boost::pfr::names_as_array<S>();
boost::pfr::for_each_field(
s,
[&names](const auto& field, std::size_t idx)
{ std::cout << idx << ": " << names[idx] << " = " << field << '\n'; });
输出:
0: i = 1
1: d = 2
2: s = three
这个怎么工作的?这篇博客文章解释了如何重新利用聚合初始化来获取字段,但是获取字段名字似乎像是魔法!但是我在最新的三个编译器(最新的Visual C++,gcc 13.2,clang 16)上得到了上面的输出。看着core_name20_static.hpp中的代码,我也没明白多少。
get_name
示例代码,目前在Visual C++上可以正常工作,但在clang上构建时会出现与extern const T fake_object
相关的错误,但在gcc上使用-fpermissive
可以正常工作。 - undefinedstd::source_location
的函数,就可以修剪掉多余的字节并得到编译时常量。 - undefined