【问题标题】:Introspecting a struct definition with boost.hana用 boost.hana 反省结构定义
【发布时间】:2018-06-29 21:36:59
【问题描述】:

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

所以假设我们有通常的

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

文档给出了一个自省该结构的 object 的示例,类似于

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢这个很好的例子,我认为这真的很有用,可能是对 Boost.Hana 用户文档的一个很好的补充,内省部分 - 不过可能需要逐步解释。
    猜你喜欢
    • 2016-01-18
    • 1970-01-01
    • 2016-01-09
    • 2017-10-06
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多