gpt4 book ai didi

c++ - 使用 boost.hana 反省结构定义

转载 作者:搜寻专家 更新时间:2023-10-31 01:28:51 25 4
gpt4 key购买 nike

在这里从 MPL 和 Fusion 迁移到 Hana!

所以假设我们有通常的

struct Person {
BOOST_HANA_DEFINE_STRUCT(Person,
(std::string, name),
(int, age)
);
};

文档给出了一个内省(introspection)这个结构的对象的例子,按照

Person john;
static_assert(hana::keys(john) == hana::make_tuple("name"_s, "age"_s));

但是否有可能反省结构本身,即获取字段列表及其类型和名称?

当然,我可以对我正在使用的类型强加一个额外的要求是默认可构造的,并且只创建一个虚拟对象来自省(introspection),但这似乎是错误的。

最佳答案

您可以使用 std::declval 而不是默认构造.它的使用必须在 decltype 中。

暂时,c++20 将支持在 decltype 中使用 lambda。

这是一个适用于 c++14 的示例。

#define BOOST_HANA_CONFIG_ENABLE_STRING_UDL
#include <boost/hana.hpp>
#include <string>

namespace hana = boost::hana;
using namespace hana::literals;

struct Person {
BOOST_HANA_DEFINE_STRUCT(Person,
(std::string, name),
(int, age)
);
};

template <typename S>
constexpr auto names = decltype(hana::unpack(std::declval<S>(),
hana::on(hana::make_tuple, hana::first))){};

template <typename S>
constexpr auto types = decltype(hana::unpack(std::declval<S>(),
hana::on(hana::make_tuple, hana::compose(hana::typeid_, hana::second)))){};

int main() {
static_assert(names<Person> == hana::make_tuple("name"_s, "age"_s), "");
static_assert(types<Person> == hana::tuple_t<std::string, int>, "");
}

关于c++ - 使用 boost.hana 反省结构定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51109687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com