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

C++能否多次解包参数包?实现重复类型的tuple模板类

如何多次解包C++参数包实现重复类型的tuple

当然可以实现多次解包参数包的需求!针对你想通过ExampleClass<2, int, float>生成包含2个std::vector<int>和2个std::vector<float>的tuple的场景,我们可以用C++模板元编程来搞定类型层面的重复展开。

核心思路

我们需要把参数包中的每个类型,按照指定的次数(numUnpacks)重复包装成std::vector<T>,再把所有这些重复后的类型合并成一个完整的tuple类型。这里分两步实现:

  • 先写一个辅助模板,用来将单个类型重复N次,生成对应的tuple类型
  • 再将参数包中每个类型的重复结果合并成最终的tuple

完整代码实现

#include <tuple>
#include <vector>
#include <type_traits>
#include <utility>

// 辅助模板:将单个类型T重复N次,生成tuple<T, T, ..., T>(共N个)
template <int N, typename T, typename = std::make_index_sequence<N>>
struct RepeatSingle;

template <int N, typename T, std::size_t... Is>
struct RepeatSingle<N, T, std::index_sequence<Is...>> {
    // 利用index_sequence展开,每个Is对应一个T类型
    using type = std::tuple<decltype((void)Is, T)...>;
};

template <int numUnpacks, typename... Types>
class ExampleClass {
private:
    // 对参数包中的每个类型T,生成包含numUnpacks个vector<T>的tuple类型
    template <typename T>
    using RepeatedVectorTuple = typename RepeatSingle<numUnpacks, std::vector<T>>::type;

public:
    // 用tuple_cat的类型推导,合并所有重复后的tuple,得到最终的tuple类型
    using TupleType = decltype(std::tuple_cat(std::declval<RepeatedVectorTuple<Types>>()...));
};

// 验证是否符合预期
int main() {
    static_assert(std::is_same_v<
        ExampleClass<2, int, float>::TupleType,
        std::tuple<std::vector<int>, std::vector<int>, std::vector<float>, std::vector<float>>
    >, "类型不符合预期");
    return 0;
}

代码说明

  1. RepeatSingle模板:借助std::make_index_sequence生成0到N-1的索引序列,通过展开这个序列来重复生成N个相同的类型,最终包装成tuple。
  2. RepeatedVectorTuple别名:把参数包中的每个类型T,先包装成std::vector<T>,再用RepeatSingle重复numUnpacks次,得到单个类型的重复tuple。
  3. TupleType的生成:利用std::tuple_cat的特性(它能合并多个tuple为一个),通过decltype推导合并后的类型,这里用到了C++17的折叠表达式来展开参数包中的所有RepeatedVectorTuple。

如果你的编译器还不支持C17,也可以手动实现一个合并tuple类型的模板来替代decltype(std::tuple_cat(...))的逻辑,不过现在主流编译器(GCC 7+、Clang 5+、MSVC 2017+)都已经支持C17了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:50:52