You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过模板特化提取boost::fusion::map所有键存入std::tuple

实现方案

不需要递归调用,直接通过可变参数模板特化展开即可完成需求,实现代码如下:

#include <boost/fusion/container/map.hpp>
#include <tuple>
#include <type_traits>

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;

// 特化匹配boost::fusion::map类型
template <typename... FusionPairs>
struct GetTypes<boost::fusion::map<FusionPairs...>> {
    // 批量提取所有fusion::pair的first_type(键类型)构造tuple
    using type = std::tuple<typename FusionPairs::first_type...>;
};

int main() {
    using Map = typename MyEvents::EventMap;
    using AllKeys = GetTypes<Map>::type;
    // 验证类型正确性
    static_assert(std::is_same_v<AllKeys, std::tuple<MyEvents::EventA, MyEvents::EventB>>);
    return 0;
}

实现说明

  • boost::fusion::map的所有模板参数都是boost::fusion::pair<键类型, 值类型>的实例,每个fusion::pair类型内置了first_type别名指代键类型,second_type别名指代值类型
  • 特化时通过可变参数FusionPairs...接收所有fusion::pair类型,展开时批量提取每个参数的first_type即可直接构造目标tuple,无递归开销
  • 该实现兼容空的boost::fusion::map,会自动返回空std::tuple<>类型

内容的提问来源于stack exchange,提问作者Juergen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:48:05