如何替换C++代码中auto引用关键字?解析auto处理逻辑
C++二维数组打印函数的auto解析与替换方案
一、原代码中auto的处理逻辑
你代码里的const auto & matrix是C++17引入的模板函数自动推导语法,本质上等价于一个隐式的模板函数:
template<typename T> void printMatrix(const T& matrix) { // ... }
当你传入int matrix[][3]时,编译器会自动推导T为int[3][3](对应你定义的3行3列数组);传入int matrix2[][6]时,T会被推导为int[3][6]。编译器会为这两种不同的类型分别生成printMatrix的实例,数组的维度信息被完整保留在推导后的类型里,因此可以直接用范围for循环遍历每一行和每一列。
二、替换auto的无指针方案
如果不想用auto,也不想手动传递行列尺寸,可以用带模板尺寸参数的数组引用,让编译器自动推导二维数组的行数和列数:
针对int类型二维数组的版本
#include <iostream> using namespace std; // 模板参数N推导行数,M推导列数 template<size_t N, size_t M> void printMatrix(const int (&matrix)[N][M]) { for (const auto& row : matrix) { for (int val : row) { cout << val << " "; } cout << endl; } } int main() { int matrix[][3] = {{1,2,3}, {4,5,6}, {7,8,9}}; int matrix2[][6] = {{1,2,3,4,5,6}, {7,8,9,10,11,12}, {13,14,15,16,17,18}}; printMatrix(matrix); printMatrix(matrix2); return 0; }
支持任意类型二维数组的通用版本
如果需要处理double、float等其他类型的数组,可以把元素类型也改成模板参数:
template<size_t N, size_t M, typename T> void printMatrix(const T (&matrix)[N][M]) { for (const auto& row : matrix) { for (const auto& val : row) { cout << val << " "; } cout << endl; } }
这个版本里,T会被编译器自动推导为数组的元素类型,N和M推导行列数,完全不需要手动传递尺寸参数,也没有用到指针。
内容的提问来源于stack exchange,提问作者mahdi nemati
相关产品推荐
相关产品推荐

