c++ 可变参数升压融合映射别名模板

c++ Variadic boost fusion map alias template

提问人:Juergen 提问时间:10/18/2021 更新时间:10/18/2021 访问量:97

问:

请考虑以下代码片段:

#include <boost/fusion/container/map.hpp>
#include <boost/fusion/include/pair.hpp>

struct MsgA {};
struct MsgB {};

using MsgList = std::tuple<MsgA, MsgB>;

template <typename Msg>
class MsgSignal {};

template <typename... Args>
using MsgSignals =
    boost::fusion::map<boost::fusion::pair<Args, MsgSignal<Args>>, ...>;

int main() {
    MsgSignals<MsgList> signals;
    // signals should be of type boost::fusion::map<boost::fusion::pair<MsgA, MsgSignal<MsgA>,
                                                    boost::fusion::pair<MsgB, MsgSignal<MsgB>>>                                     >
}

演示

我正在为别名模板而苦苦挣扎。MsgSignals

什么是正确的语法,使得signals

boost::fusion::map<boost::fusion::pair<MsgA, MsgSignal<MsgA>,
                   boost::fusion::pair<MsgB, MsgSignal<MsgB>>> 
C++ 元组 variadic-templates boost-fusion

评论

1赞 Jarod42 10/18/2021
错别字顺便说一句:->(逗号已删除)pair</*..*/>, ...pair</*..*/>...

答:

2赞 康桓瑋 10/18/2021 #1

您可以使用模板部分专用化来提取以下类型:std::tuple

template <typename Tuple>
struct MsgSignalsImpl;

template <typename... Args>
struct MsgSignalsImpl<std::tuple<Args...>> {
  using type = boost::fusion::map<boost::fusion::pair<Args, MsgSignal<Args>>...>;
};

template <typename Tuple>
using MsgSignals = typename MsgSignalsImpl<Tuple>::type;

演示。