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

如何编写适配多种类数组类型的通用AddOne函数避免代码重复?

用C++模板函数解决类数组类型的通用适配问题

当然可以!这种重复实现完全没必要——C++的模板函数就是专门解决这类「逻辑相同、适配多种类型」的场景的,写一次代码就能搞定所有符合要求的类数组类型。

核心思路

模板函数允许我们编写不依赖具体类型的通用代码,编译器会根据传入的实际参数类型,自动生成对应的函数实例。只要你的目标类型支持下标运算符[](对于容器类最好还支持size()方法,或者能被范围for循环遍历),就能直接适配。

实现代码

我们可以写两个模板版本,分别适配带size()方法的容器(比如std::vector、std::array)和C数组:

// 适配std::vector、std::array等容器的版本
template <typename Container>
void AddOne(Container& container) {
    // 用范围for循环更简洁,不需要手动处理索引和size
    for (auto& elem : container) {
        elem += 1;
    }
}

// 专门适配C数组的版本(编译器会自动推导数组元素类型和大小)
template <typename T, size_t N>
void AddOne(T (&array)[N]) {
    for (auto& elem : array) {
        elem += 1;
    }
}

使用示例

不管是哪种类数组类型,调用方式完全一致:

#include <vector>
#include <array>
#include <iostream>

int main() {
    // 测试std::vector<double>
    std::vector<double> vec = {1.0, 2.0, 3.0};
    AddOne(vec);
    for (auto num : vec) std::cout << num << " "; // 输出:2 3 4 

    // 测试std::array<double, 3>
    std::array<double, 3> arr = {4.0, 5.0, 6.0};
    AddOne(arr);
    for (auto num : arr) std::cout << num << " "; // 输出:5 6 7 

    // 测试C数组
    double c_arr[] = {7.0, 8.0, 9.0};
    AddOne(c_arr);
    for (auto num : c_arr) std::cout << num << " "; // 输出:8 9 10 

    return 0;
}

为什么这能工作?

  • 第一个模板函数:只要传入的类型是可迭代的(支持范围for循环),并且元素可以被+=1操作,就能正常运行——std::vector和std::array都满足这个要求。
  • 第二个模板函数:利用C++的模板参数推导特性,编译器会自动获取C数组的元素类型T和大小N,不需要手动传入size参数,使用起来和容器版本一样方便。

如果你不想写两个版本,也可以用更通用的方式(比如结合std::begin和std::end),但上面的写法更直观,也更容易理解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:29:44