Анализ структуры с помощью boost.hana - PullRequest
0 голосов
/ 30 июня 2018

Миграция из 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));

Но возможно ли проанализировать саму структуру, а именно получить список полей, их типы и имена?

Конечно, я мог бы наложить дополнительные требования на типы, с которыми я работаю, чтобы они конструировались по умолчанию, и просто создать фиктивный объект для самоанализа, но это кажется неправильным.

1 Ответ

0 голосов
/ 30 июня 2018

Вместо конструкции по умолчанию вы можете использовать std::declval. Его использование должно быть внутри decltype.

Ориентировочно, c ++ 20 будет поддерживать использование лямбд в пределах decltype.

Вот пример, который работает с 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>, "");
}
...