首页 > 解决方案 > 将所有 boost fusion map 键收集到一个 std::tuple

问题描述

考虑这个片段:

#include <boost/fusion/container/map.hpp>
#include <boost/fusion/sequence/intrinsic/at_key.hpp>
#include <boost/fusion/sequence/intrinsic/value_at_key.hpp>
#include <tuple>

struct MyEvents {
    struct EventA;
    struct EventB;
    using EventMap = boost::fusion::map<boost::fusion::pair<EventA, int>,
                                        boost::fusion::pair<EventB, double>>;
};

template <typename T>
struct GetTypes;

template <typename T>
struct GetTypes<boost::fusion::map<...>> {
    using type = std::tuple<...>;
};

int main() {
    using Map = typename MyEvents::EventMap;
    using AllKeys = GetTypes<Map>::type;

    return 0;
}

演示

我想将所有密钥类型从 a 收集boost::fusion::map到 astd::tuple中。

此代码段中的键是MyEvents::EventAand MyEvents::EventB,所以AllKeys = std::tuple<MyEvents::EventA, MyEvents::EventB>

模板专业化怎么能做到这一点?我需要某种递归调用吗?

标签: c++template-meta-programmingboost-fusion

解决方案


boost::fusion::pair您可以使用获取密钥类型T::first_type

template <typename T>
struct GetTypes;

template <typename... Pairs>
struct GetTypes<boost::fusion::map<Pairs...>> {
    using type = std::tuple<typename Pairs::first_type...>;
};

演示。


推荐阅读