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

如何使用模板元编程实现自定义Vector的zip功能

实现自定义Vector的zip元函数(按索引元素相乘)

完整实现代码

#include <type_traits>

// 自定义Vector模板
template<int... vals>
struct Vector {};

// 辅助元函数:获取Vector的第一个元素值
template<typename Vec>
struct vector_first;

template<int First, int... Rest>
struct vector_first<Vector<First, Rest...>> {
    static constexpr int value = First;
};

// 辅助元函数:获取Vector去掉第一个元素后的剩余类型
template<typename Vec>
struct vector_rest;

template<int First, int... Rest>
struct vector_rest<Vector<First, Rest...>> {
    using type = Vector<Rest...>;
};

// zip元函数核心实现
template<typename... Vectors>
struct zip;

// 终止条件:所有输入Vector均为空时,返回空Vector
template<typename... EmptyVecs>
struct zip<EmptyVecs...>
    : std::enable_if_t<(std::is_same_v<EmptyVecs, Vector<>> && ...), std::type_identity<Vector<>>> {};

// 递归情况:处理每个Vector的当前索引元素,计算乘积后递归处理剩余元素
template<typename FirstVec, typename... RestVecs>
struct zip<FirstVec, RestVecs...> {
    // 用C++17折叠表达式计算当前索引所有元素的乘积
    static constexpr int current_product = vector_first<FirstVec>::value * (... * vector_first<RestVecs>::value);
    // 递归处理所有Vector去掉第一个元素后的剩余部分
    using remaining_zip = zip<typename vector_rest<FirstVec>::type, typename vector_rest<RestVecs>::type...>;
    // 组装最终结果Vector
    using type = Vector<current_product, typename remaining_zip::type::vals...>;
};

代码解释

  1. Vector模板:基础整数序列容器,通过模板参数包存储元素。
  2. vector_first/vector_rest辅助元函数:分别负责提取Vector的第一个元素值,以及生成去掉第一个元素后的剩余Vector类型,为递归遍历提供基础支持。
  3. zip终止条件:借助std::enable_if和折叠表达式判断所有输入Vector是否为空,此时返回空Vector,结束递归流程。
  4. zip递归逻辑:
    • 用折叠表达式一次性计算当前索引下所有Vector对应元素的乘积。
    • 递归调用zip处理每个Vector去掉首元素后的剩余部分。
    • 将当前索引的乘积结果与递归得到的剩余元素组合,生成最终的结果Vector类型。

测试验证

// 定义输入Vector
using Vec1 = Vector<1, 2, 3>;
using Vec2 = Vector<2, 3, 4>;
using Vec3 = Vector<3, 4, 5>;

// 计算zip结果
using ZipResult = zip<Vec1, Vec2, Vec3>::type;

// ZipResult的类型为Vector<6, 24, 60>,符合预期

额外说明

  • 该实现要求所有输入Vector长度相同,否则递归到某一步会出现部分Vector为空、部分仍有元素的情况,触发编译错误。若需支持不同长度的Vector(比如取最短长度),可修改终止条件,当任意一个Vector为空时停止递归。
  • 代码依赖C17特性(折叠表达式、std::enable_if_t、std::type_identity),如果需要兼容C11/C++14,可以将折叠表达式替换为递归的乘积计算元函数,并改用std::enable_if的旧式写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:15:37