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

C++11中传递std::array引用时如何避免指定数组大小?

如何在传递std::array引用的函数中避免指定数组大小?

嗨,我完全懂你的烦恼——每次在main里创建不同大小的std::array,就得手动修改passbyref函数里的数组大小参数,实在太繁琐了!其实用模板函数就能完美解决这个问题,让函数自动适配任意大小的std::array。

先看看你遇到问题的场景代码(补全了passbyref的示例):

#include<iostream>
#include<string>
#include<iomanip>
#include<array>
using namespace std;

class GradeBook {
public:
    // 这里必须指定固定大小,换数组大小就得改代码
    void passbyref(array<int, 5>& arr) {
        arr[0] = 100;
    }

    void changevalues() {
        array<int, 3> arr2 = {1,2,3};
        cout<<arr2[2]<<endl;
        arr2[2]=2;
        cout<<arr2[2]<<endl;
    }
};

int main() {
    GradeBook gb;
    array<int, 5> arr1 = {1,2,3,4,5};
    gb.passbyref(arr1); // 没问题

    array<int, 3> arr3 = {6,7,8};
    // gb.passbyref(arr3); // 这里直接报错,因为函数只接受size=5的array
    return 0;
}

解决方案:模板成员函数

把passbyref改成模板函数,将数组的大小作为模板参数,编译器会自动推导这个参数的值,不用你手动指定:

#include<iostream>
#include<string>
#include<iomanip>
#include<array>
using namespace std;

class GradeBook {
public:
    // 模板函数,自动推导数组大小N
    template<size_t N>
    void passbyref(array<int, N>& arr) {
        // 示例操作:遍历修改数组元素
        for (auto& num : arr) {
            num *= 2; // 每个元素乘2
        }
    }

    void changevalues() {
        array<int, 3> arr2 = {1,2,3};
        cout<<arr2[2]<<endl;
        arr2[2]=2;
        cout<<arr2[2]<<endl;
    }
};

int main() {
    GradeBook gb;
    array<int, 5> arr1 = {1,2,3,4,5};
    gb.passbyref(arr1); // 自动推导N=5
    for (int num : arr1) {
        cout << num << " "; // 输出:2 4 6 8 10
    }
    cout << endl;

    array<int, 3> arr3 = {6,7,8};
    gb.passbyref(arr3); // 自动推导N=3
    for (int num : arr3) {
        cout << num << " "; // 输出:12 14 16
    }
    cout << endl;

    gb.changevalues();
    return 0;
}

进阶:支持任意类型的std::array

如果想让函数不仅适配不同大小,还支持不同元素类型(比如double、string),可以把元素类型也作为模板参数:

template<typename T, size_t N>
void passbyref(array<T, N>& arr) {
    // 示例操作:给每个元素加1(只要T类型支持+=操作)
    for (auto& elem : arr) {
        elem += 1;
    }
}

这样不管你传array<double, 4>还是array<string, 2>,函数都能正常工作啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:11:14