当我打电话时:a7[0][1][100];
我能够获得0
中的第一个索引operator[]
,但是作为索引,我将无法递归获得其他索引值1和100。我如何能够使用operator[]
以获得递归的后续索引值。在此示例中,对于3维数组,对于第一个维operator[]
,0
仅被调用一次。
我的示例代码如下:
template <class T, unsigned ... RestD> struct array;
template <class T, unsigned PrimaryD>
struct array <T, PrimaryD> {
typedef T type[PrimaryD];
type data;
T& operator[] (unsigned i) {
return data[i];
}
};
template <class T, unsigned PrimaryD, unsigned ... RestD>
struct array <T, PrimaryD, RestD...> {
typedef typename array<T, RestD...>::type OneDimensionDownArrayT;
typedef OneDimensionDownArrayT type[PrimaryD];
type data;
OneDimensionDownArrayT& operator[] (int i) {
OneDimensionDownArrayT& a = data[i];
return a;
}
};
int main () {
array<int, 1, 2, 3> a7 {{{{1, 2, 3},{4, 5, 6}}}};
a7[0][1][2] = 100; //=>won't recursively go through operator[]
//I want to recursively obtain 0, 1 and 2 as index values
a7[0][1][100] = 100; //also works correctly.
std::cout << a7[0][1][100] << std::endl;
return 0;
}
最佳答案
这里的错误实际上有点微妙,改变了这一行
typedef typename array<T, RestD...>::type OneDimensionDownArrayT;
至
typedef array<T, RestD...> OneDimensionDownArrayT;
这样做的原因是因为
array<int, 1, 2, 3>::type
等于array<int, 2, 3>::type
,等于array<int, 3>::type
,即int
。最后,您得到的array<int, 1, 2, 3>::OneDimensionDownArrayT
等于int[2][3]
。这就是为什么您只在重载的operator []中下降了一层,因为它返回一个实际的int数组。您可以通过添加主要方法来亲自查看以下内容:
auto & e1 = a7[0];
auto & e2 = e1[0];
auto & e3 = e2[1];
auto & e4 = e3[2];
e4 = 100;
而不是一次访问它们。然后使用调试器逐步检查e1-e4的类型。 e1的类型将为
int (&) [2][3]
而不是array<int, 2, 3> &
。要在堆而不是堆栈上分配它们,请在您的类中声明指向
OneDimensionDownArrayT
的指针(而不是它们的数组),定义构造函数和分解器,以处理分配/解除分配数组的工作。它可能看起来像这样: template <class T, unsigned PrimaryD, unsigned ... RestD>
struct array <T, PrimaryD, RestD...> {
typedef typename array<T, RestD...>::type OneDimensionDownArrayT;
array():data(new OneDimensionDownArrayT[PrimaryD]){}
~array() {
delete[] data;
}
OneDimensionDownArrayT * data;
OneDimensionDownArrayT& operator[] (int i) {
OneDimensionDownArrayT& a = data[i];
return a;
}
};
您还将需要为您的类定义一个复制构造函数,移动构造函数和赋值运算符。此实现将占用更少的堆栈空间,但总体上总的内存会略多一些,因为您还需要用于指针和数组本身的空间。
关于c++ - 多维数组中的Operator []重载c++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16654890/