C++实现可变参类型列表转pair组成tuple的非递归元函数
非递归实现相邻类型打包为pair元组
需求说明
需要实现元函数将输入的偶数个类型序列T1, T2, T3, T4, ...., T2n-1, T2n转换为如下结构:
tuple< pair<T1, T2>, pair<T3, T4>, ..., pair<T2n-1, T2n> >
元函数定义形式为:
template <class... Args> using split_in_pairs_t = ???
支持如下使用场景:
template <class... Args> class UseCase { split_in_pairs_t<Args...> _tupleOfPairs; };
要求优先使用非递归方案实现。
实现代码
基于标准库std::index_sequence实现的非递归版本,无自定义递归模板逻辑,支持C++14及以上标准:
#include <tuple> #include <utility> #include <type_traits> template <class... Args, std::size_t... Is> constexpr auto split_in_pairs_impl(std::index_sequence<Is...>) { // 校验参数个数必须为偶数 static_assert(sizeof...(Args) % 2 == 0, "split_in_pairs_t requires an even number of template type arguments"); return std::tuple< std::pair< std::tuple_element_t<2*Is, std::tuple<Args...>>, std::tuple_element_t<2*Is + 1, std::tuple<Args...>> >... >{}; } template <class... Args> using split_in_pairs_t = decltype(split_in_pairs_impl<Args...>( std::make_index_sequence<sizeof...(Args) / 2>{} ));
实现说明
- 核心逻辑是通过
std::make_index_sequence生成从0到(参数个数/2 - 1)的索引序列,全程依赖编译器包展开完成类型构造,无手写递归特化逻辑 - 内置静态断言,传入奇数个类型参数时会触发明确的编译错误
- 天然支持空参数包场景,空包输入返回空
tuple<>类型 - 可通过如下静态断言验证类型正确性:
#include <string> // 普通场景校验 static_assert(std::is_same_v< split_in_pairs_t<int, double, std::string, char>, std::tuple<std::pair<int, double>, std::pair<std::string, char>> >); // 空参数包校验 static_assert(std::is_same_v< split_in_pairs_t<>, std::tuple<> >);
内容的提问来源于stack exchange,提问作者Lorah Attkins
相关产品推荐
相关产品推荐

