使用 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>, "");
}
在这里从 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>, "");
}