有没有办法为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?
最佳答案
我在这里找到解决方案: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/