如何通过模板特化提取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
相关产品推荐
相关产品推荐

