c++ - 使用模板参数定义 Hana 结构

标签 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 结构?

最佳答案

我在这里找到了解决方案: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)
    );
};

关于c++ - 使用模板参数定义 Hana 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50109798/

相关文章:

c++ - 用于解析 C++ 源代码并将头内内联方法移动到 .cpp 源文件的工具?

c++ - 用于 OpenGL3.1+ 上下文的分层 COLLADA 加载器

html - 用不同的样式格式化不同的输入

c# - 将 Asp.net MVC 模型数据绑定(bind)到 kendo TreeView 模板(本地数据)

c++ - 如何识别boost fusion vector 中的类型

c++ - 拥有超过 64 个成员的 BOOST_FUSION_ADAPT_STRUCT 是怎么回事?

python - 在 c++ 中嵌入 python,示例

c++ - 为什么我们在 C++ 中使用返回数据结构的函数?

c++ - 类型 T 的构造函数

c++ - 如何让迭代器进入 boost fusion map?