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
相关产品推荐
相关产品推荐

