如何获取经boost-hana适配的C++结构体的字段数量?
正确获取Boost.Hana适配结构体的字段数量
首先,先修正你代码里的两个关键问题:
1. 修正结构体适配代码
你写的适配宏里多了一个不存在的成员position,这会导致适配失败,应该改成:
#include <boost/hana/adapt_struct.hpp> struct MyStruct { int field1; float field2; }; BOOST_HANA_ADAPT_STRUCT(MyStruct, field1, field2);
2. 正确计算字段数量的方法
你原来的代码错误在于,boost::hana::length不能直接作用于MyStruct类型——BOOST_HANA_ADAPT_STRUCT只是让结构体支持Hana的反射机制,并没有把它变成Hana的序列类型。我们需要通过Hana提供的反射函数获取对应的成员序列,再计算长度。
方法一:通过members获取成员序列(需要结构体实例)
boost::hana::members会返回一个包含结构体成员的Hana tuple,我们可以直接计算这个tuple的长度:
#include <boost/hana.hpp> namespace hana = boost::hana; constexpr std::size_t NUMBER_OF_FIELDS = hana::length(hana::members(MyStruct{})); static_assert(NUMBER_OF_FIELDS == 2);
方法二:通过accessors获取访问器序列(无需实例)
如果你不想创建结构体实例,可以用boost::hana::accessors,它返回一个包含每个字段访问器的序列,序列的长度就是字段数量:
constexpr std::size_t NUMBER_OF_FIELDS = hana::length(hana::accessors<MyStruct>()); static_assert(NUMBER_OF_FIELDS == 2);
方法三:通过type_c获取类型的成员序列(无需实例)
也可以用hana::type_c来传递结构体类型,配合members获取对应的元数据序列:
constexpr std::size_t NUMBER_OF_FIELDS = hana::length(hana::members(hana::type_c<MyStruct>)); static_assert(NUMBER_OF_FIELDS == 2);
简单来说,核心就是:length需要作用于Hana的序列类型/实例,而不是原始的结构体类型,通过members或accessors就能拿到对应的序列,进而计算字段数。
内容的提问来源于stack exchange,提问作者Elad Maimoni




