使用 boost.hana 自省结构定义

Introspecting a struct definition with boost.hana

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

所以假设我们有通常的

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

文档给出了一个内省此结构的 对象 的示例,按照

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

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

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

您可以使用 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>, "");
}