c++ - 将所有 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::EventA
and MyEvents::EventB
,所以AllKeys = std::tuple<MyEvents::EventA, MyEvents::EventB>
。
模板专业化怎么能做到这一点?我需要某种递归调用吗?
解决方案
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...>;
};
推荐阅读
- python - 使用`scipy.optimize.fsolve`时如何修复TypeError?
- python - 将 CSV 文件读入 MySQL 并使用 executemany 而不是 execute
- r - 如何将列中的是/否更改为 1 和 0
- javascript - AJAX - Promise.all 方法 - 意外的输出困境
- python - TypeError 的 Python 问题:+ 的不支持的操作数类型:'int' 和 'str'
- vuejs2 - 以编程方式重置 vue-flatpickr 上的配置选项
- node.js - Speech to Text:使用 NodeJS 将麦克风流通过管道传输到 Watson STT
- java - 如果它们发生变化,Runnable 是否共享数据结构?
- javascript - 更改嵌套 html 元素的颜色后,悬停效果将不起作用
- node.js - 在 Ember 中使用 process.env 变量