如何为带模板参数的结构体定义/适配Boost.Hana结构?
给带模板参数的结构体适配Boost.Hana结构的方法
刚好我之前处理过类似的问题,Boost.Hana的BOOST_HANA_DEFINE_STRUCT宏默认是给非模板结构体设计的,直接套模板类会因为宏的展开逻辑卡壳,导致编译错误。下面给你两种靠谱的解决思路:
方案一:用BOOST_HANA_ADAPT_STRUCT做外部适配
这个宏比DEFINE_STRUCT更适合模板场景,因为它是在结构体外部完成元数据绑定,不用在结构体内部纠结模板参数的写法。示例代码如下:
#include <boost/hana/adapt_struct.hpp> #include <string> namespace hana = boost::hana; template<class S = std::string, class I = int> struct Person { S name; I age; }; // 给模板结构体做适配 BOOST_HANA_ADAPT_STRUCT(Person<S, I>, name, age);
如果需要针对特定模板实例适配,也可以这么写:
// 适配默认参数的Person实例 BOOST_HANA_ADAPT_STRUCT(Person<>, name, age); // 适配指定类型的实例,比如宽字符名+长整型年龄 BOOST_HANA_ADAPT_STRUCT(Person<std::wstring, long>, name, age);
方案二:在结构体内部正确使用BOOST_HANA_DEFINE_STRUCT
要是你坚持要在结构体内部定义元数据,可以先给当前模板实例起个别名,让宏能正确识别类型:
#include <boost/hana/define_struct.hpp> #include <string> namespace hana = boost::hana; template<class S = std::string, class I = int> struct Person { using this_type = Person<S, I>; BOOST_HANA_DEFINE_STRUCT(this_type, (S, name), (I, age)); };
这样写后,宏展开时能准确拿到完整的模板实例类型,编译就能顺利通过了。
简单总结下:方案一的外部适配更灵活,适合需要支持多模板实例的场景;方案二更紧凑,适合在结构体定义时就绑定元数据的情况。
内容的提问来源于stack exchange,提问作者alfC
相关产品推荐
相关产品推荐

