alp*_*per 5 c++ operator-overloading recursive-datastructures multidimensional-array variadic-templates
当我打电话:a7 [0] [1] [100];
我能够在operator []中获得第一个索引'0'但是因为索引I将无法以递归方式获得其他索引值1和100.我怎么能够使用operator []来获得递归的folowing索引值.在这个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;
}
Run Code Online (Sandbox Code Playgroud)
这里的错误其实有点微妙,改一下行
typedef typename array<T, RestD...>::type OneDimensionDownArrayT;
Run Code Online (Sandbox Code Playgroud)
到
typedef array<T, RestD...> OneDimensionDownArrayT;
Run Code Online (Sandbox Code Playgroud)
这样做的原因是因为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]。这就是为什么您只在重载的运算符[]中下降一级,因为它返回一个实际的整数数组。您可以通过添加 main 方法来亲自查看这一点:
auto & e1 = a7[0];
auto & e2 = e1[0];
auto & e3 = e2[1];
auto & e4 = e3[2];
e4 = 100;
Run Code Online (Sandbox Code Playgroud)
而不是一次性访问它们。然后使用调试器单步执行并检查 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;
}
};
Run Code Online (Sandbox Code Playgroud)
您还需要为您的类定义复制构造函数、移动构造函数和赋值运算符。此实现将在堆栈上占用更少的空间,但总体上会占用更多的内存,因为指针和数组本身也需要空间。
| 归档时间: |
|
| 查看次数: |
2122 次 |
| 最近记录: |