结构体封装固定大小二维数组的下标运算符返回数组类型问题
让结构体封装的二维数组支持原生数组的sizeof特性
原生固定大小二维数组T array[M][N]中,array[i]的类型是T[N],因此sizeof(array[i])等于N * sizeof(T)。但你当前的结构体代码里,operator[]返回T*,导致sizeof(array[i])变成指针的大小,断言自然失败。
C++确实不能直接返回数组类型,但可以返回数组的引用,这就能解决问题。修改operator[]的返回类型为constexpr T(&)[N],具体代码如下:
template<class T, int M, int N> struct Array { T data[M][N]; // 返回数组的引用,而非指针 constexpr T(&operator[](int i))[N] { return data[i]; } // 补充const版本,支持const对象访问 constexpr const T(&operator[](int i) const)[N] { return data[i]; } };
这样修改后,array[i]的类型是T[N]的引用,sizeof(array[i])就会等于N * sizeof(T),和原生二维数组的行为完全一致,同时依然支持array[i][j]的访问方式——因为数组引用可以像普通数组一样使用下标运算符。
测试断言的示例代码:
#include <cassert> int main() { Array<int, 3, 4> arr; assert(sizeof(arr[0]) == 4 * sizeof(int)); // 断言会成功 return 0; }
内容的提问来源于stack exchange,提问作者user2052436
相关产品推荐
相关产品推荐

