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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:09:16