使用模板参数定义Hana结构

时间:2018-05-01 00:05:03

标签: c++ templates boost-fusion boost-hana

有没有办法为Hana定义(改编)具有模板参数的结构?

canonical example是非模板类

#include <boost/hana/define_struct.hpp>
#include <string>

namespace hana = boost::hana;

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

我尝试添加模板参数时出现编译错误:

template<class S = std::string, class I = int>
struct Person {
    BOOST_HANA_DEFINE_STRUCT(Person<S, I>,
        (S, name),
        (I, age)
    );
};

我虽然因为使用了逗号而失败了,所以我尝试用decltype(Person<S, I>)代替Person<S,I>

在Boost.Fusion中我们有 BOOST_FUSION_DEFINE_TPL_STRUCT,但我找不到Hana中的等价物。

如何使用模板参数定义Hana Struct?

1 个答案:

答案 0 :(得分:2)

我在这里找到了解决方案:https://boostorg.github.io/hana/group__group-Struct.html

template<class S, class I>
struct Person {
    S name;
    I age;

    struct hana_accessors_impl {
        static BOOST_HANA_CONSTEXPR_LAMBDA auto apply() {
            return boost::hana::make_tuple(
                boost::hana::make_pair(BOOST_HANA_STRING("name"),
                [](auto&& p) -> decltype(auto) {
                    return boost::hana::id(std::forward<decltype(p)>(p).name);
                }),
                boost::hana::make_pair(BOOST_HANA_STRING("age"),
                [](auto&& p) -> decltype(auto) {
                    return boost::hana::id(std::forward<decltype(p)>(p).age);
                })
            );
        }
    };
};

提出了其他问题,为什么Hana需要第一个参数呢?既然没有必要呢?

顺便说一句,这也有效,这是我没有尝试过的。 我不确定它是否有效。

template<class S, class I>
struct Person {
    BOOST_HANA_DEFINE_STRUCT(Person,
        (std::string, name),
        (int, age)
    );
};