C++如何正确定义基于boost fusion map的可变参数别名模板MsgSignals
正确实现方案
你需要补充tuple参数解包逻辑,同时修正参数包展开语法,完整实现如下:
#include <boost/fusion/container/map.hpp> #include <boost/fusion/include/pair.hpp> #include <tuple> struct MsgA {}; struct MsgB {}; using MsgList = std::tuple<MsgA, MsgB>; template <typename Msg> class MsgSignal {}; // 辅助模板:用于提取tuple内的类型参数 template<typename T> struct MsgSignalsFromTuple; // 特化匹配std::tuple场景,解包所有参数 template<typename... Args> struct MsgSignalsFromTuple<std::tuple<Args...>> { using type = boost::fusion::map<boost::fusion::pair<Args, MsgSignal<Args>>...>; }; // 别名模板直接使用辅助模板的推导结果 template <typename TupleT> using MsgSignals = typename MsgSignalsFromTuple<TupleT>::type; int main() { MsgSignals<MsgList> signals; // 此时signals的类型完全符合预期: // boost::fusion::map< // boost::fusion::pair<MsgA, MsgSignal<MsgA>>, // boost::fusion::pair<MsgB, MsgSignal<MsgB>> // > }
核心修改点
- 修正参数包展开语法:原写法
boost::fusion::pair<Args, MsgSignal<Args>>, ...不符合C++参数包展开规则,正确写法是将...放在待展开的表达式末尾,即boost::fusion::pair<Args, MsgSignal<Args>>...,编译器会自动为每个参数生成对应的pair类型并以逗号分隔。 - 新增tuple解包逻辑:你传入的
MsgList是std::tuple<MsgA, MsgB>类型,直接传给可变参数模板只会被识别为单个类型参数,通过模板特化可以提取tuple内的所有类型参数,完成后续的map生成。
内容的提问来源于stack exchange,提问作者Juergen
相关产品推荐
相关产品推荐

