You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取经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的序列类型/实例,而不是原始的结构体类型,通过membersaccessors就能拿到对应的序列,进而计算字段数。

内容的提问来源于stack exchange,提问作者Elad Maimoni

火山引擎 最新活动