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

C++中如何向函数传递任意大小的二维数组

解决方案:用模板推导任意大小的二维数组

没问题,要实现支持任意大小二维int数组的函数,我们可以利用C++的模板特性来在编译期自动推导数组的行数和列数——这完全符合你不想用vector、只想用原生数组的需求。

原代码的局限

你当前的函数void func(int (&arr)[5][6])是固定绑定了5行×6列的数组类型,所以只能接收这个尺寸的数组。要适配任意大小,我们需要把数组的两个维度变成可推导的模板参数。

实现代码

下面是修改后的代码,能支持任意大小的二维int数组:

#include <iostream>

// 用模板参数Rows和Cols推导数组的行数和列数
template <size_t Rows, size_t Cols>
void func(int (&arr)[Rows][Cols]) {
    std::cout << "func called with " << Rows << " rows and " << Cols << " columns" << std::endl;
    
    // 示例:遍历并初始化数组(可选)
    for (size_t i = 0; i < Rows; ++i) {
        for (size_t j = 0; j < Cols; ++j) {
            arr[i][j] = i * Cols + j;
            std::cout << arr[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

int main() {
    int arr[5][6];
    func(arr); // 适配5×6的数组
    
    std::cout << "------------------------" << std::endl;
    
    int arr2[10][15];
    func(arr2); // 适配10×15的数组
    
    return 0;
}

工作原理

  • 模板参数Rows和Cols是编译期常量,编译器会在调用func时自动推导传入数组的行数和列数,不需要手动指定。
  • 数组引用int (&arr)[Rows][Cols]保证了我们接收的是原生二维数组,而不是指针(避免数组退化为指针丢失维度信息)。

扩展:支持任意类型的二维数组

如果以后需要支持其他类型(比如double、char),可以把数组的元素类型也改成模板参数:

template <typename T, size_t Rows, size_t Cols>
void func(T (&arr)[Rows][Cols]) {
    std::cout << "func called with " << Rows << " rows, " << Cols << " columns, type: " << typeid(T).name() << std::endl;
    // 同样可以正常操作数组元素
}

这样不管是double arr3[3][4]还是char arr4[7][2],都能传入func正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:12:39