c++ - 使用 boost.hana 内省(introspection)结构定义

标签 c++ c++14 boost-hana

从 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)结构本身,即获取字段列表及其类型和名称?

当然,我可以对我正在使用的类型施加额外的要求,使其可以默认构造,并且只创建一个虚拟对象来内省(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 内省(introspection)结构定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51109687/

相关文章:

c++ - 手动解锁 lock_guard 是未定义的/错误的设计吗?

c++ - 使用 GCC 在 Linux 上 boost 链接

c++ - VS Test Explorer为什么不显示我的C++自定义异常消息?

c++ - 在 C++ 的类构造函数中列出初始化

c++ - 为什么 `boost::hana::range_c` 不是序列?

c++ - 使用不可移动/不可复制的类型创建 hana 元组

c++ - 在指针中使用 **

c++ - 结构指针函数指向其他结构的其他函数

c++ - gtest : run TEST_P inside 2 TEST_Fs

c++ - 如何使用 Boost Hana 删除元编程递归