#include <algorithm>
#include <iostream>
using namespace std;
template <class T, int s>
class myArrayImpl {
public:
T* data;
T& operator[](int i){return data[i];}
const T& operator[](int i) const {return data[i];}
myArrayImpl(){
data=new T[s]();
}
myArrayImpl(const myArrayImpl & other){
data=new T[s];
copy(other.data,other.data+s,data);
}
myArrayImpl& operator=(const myArrayImpl& other){
T* olddata = data;
data=new T[s];
copy(other.data,other.data+s,data);
delete [] olddata;
return *this;
}
~myArrayImpl(){delete [] data;}
};
template <class T, int s>
class myArray : private myArrayImpl<T,s> {
typedef myArrayImpl<T,s> Impl;
public:
using Impl::operator[];
myArray() : Impl() {}
typedef T value_type; // !!!
explicit myArray(const value_type& value) {
fill(this->data, this->data + s, value);
}
void setAll(const value_type& value) {
fill(this->data, this->data + s, value);
}
};
template <class T, int s1, int s2>
class myArray<myArray<T,s2>,s1> : private myArrayImpl<myArray<T,s2>,s1> {
typedef myArrayImpl<myArray<T,s2>,s1> Impl;
public:
using Impl::operator[];
myArray() : Impl() {}
typedef typename myArray<T,s2>::value_type value_type; // !!!
explicit myArray(const value_type& value) {
setAll(value);
}
void setAll(const value_type& value) {
for_each(this->data, this->data + s1, [value](myArray<T,s2>& v) { v.setAll(value); });
}
};
int main() {
myArray<myArray<myArray<int,7>,8>,9> a(7);
std::cout << a[0][0][0] << std::endl;
std::cout << a[8][7][6] << std::endl;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDxjbGFzcyBULCBpbnQgcz4KY2xhc3MgbXlBcnJheUltcGwgewpwdWJsaWM6CiAgICBUKiBkYXRhOwogICAgVCYgb3BlcmF0b3JbXShpbnQgaSl7cmV0dXJuIGRhdGFbaV07fQogICAgY29uc3QgVCYgb3BlcmF0b3JbXShpbnQgaSkgY29uc3Qge3JldHVybiBkYXRhW2ldO30KICAgIG15QXJyYXlJbXBsKCl7CiAgICAgICAgZGF0YT1uZXcgVFtzXSgpOwogICAgfQogICAgbXlBcnJheUltcGwoY29uc3QgbXlBcnJheUltcGwgJiBvdGhlcil7CiAgICAgICAgZGF0YT1uZXcgVFtzXTsKICAgICAgICBjb3B5KG90aGVyLmRhdGEsb3RoZXIuZGF0YStzLGRhdGEpOwogICAgfQogICAgbXlBcnJheUltcGwmIG9wZXJhdG9yPShjb25zdCBteUFycmF5SW1wbCYgb3RoZXIpewogICAgICAgIFQqIG9sZGRhdGEgPSBkYXRhOwogICAgICAgIGRhdGE9bmV3IFRbc107CiAgICAgICAgY29weShvdGhlci5kYXRhLG90aGVyLmRhdGErcyxkYXRhKTsKICAgICAgICBkZWxldGUgW10gb2xkZGF0YTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICB+bXlBcnJheUltcGwoKXtkZWxldGUgW10gZGF0YTt9Cn07ICAKCnRlbXBsYXRlIDxjbGFzcyBULCBpbnQgcz4KY2xhc3MgbXlBcnJheSA6IHByaXZhdGUgbXlBcnJheUltcGw8VCxzPiB7CiAgICB0eXBlZGVmIG15QXJyYXlJbXBsPFQscz4gSW1wbDsKcHVibGljOgogICAgdXNpbmcgSW1wbDo6b3BlcmF0b3JbXTsKICAgIG15QXJyYXkoKSA6IEltcGwoKSB7fQogICAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7IC8vICEhIQogICAgZXhwbGljaXQgbXlBcnJheShjb25zdCB2YWx1ZV90eXBlJiB2YWx1ZSkgewogICAgICAgZmlsbCh0aGlzLT5kYXRhLCB0aGlzLT5kYXRhICsgcywgdmFsdWUpOwogICAgfQogICAgdm9pZCBzZXRBbGwoY29uc3QgdmFsdWVfdHlwZSYgdmFsdWUpIHsKICAgICAgIGZpbGwodGhpcy0+ZGF0YSwgdGhpcy0+ZGF0YSArIHMsIHZhbHVlKTsKICAgIH0KfTsgIAoKdGVtcGxhdGUgPGNsYXNzIFQsIGludCBzMSwgaW50IHMyPgpjbGFzcyBteUFycmF5PG15QXJyYXk8VCxzMj4sczE+IDogcHJpdmF0ZSBteUFycmF5SW1wbDxteUFycmF5PFQsczI+LHMxPiB7CiAgICB0eXBlZGVmIG15QXJyYXlJbXBsPG15QXJyYXk8VCxzMj4sczE+IEltcGw7CnB1YmxpYzoKICAgIHVzaW5nIEltcGw6Om9wZXJhdG9yW107CiAgICBteUFycmF5KCkgOiBJbXBsKCkge30KICAgIHR5cGVkZWYgdHlwZW5hbWUgbXlBcnJheTxULHMyPjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOyAvLyAhISEKICAgIGV4cGxpY2l0IG15QXJyYXkoY29uc3QgdmFsdWVfdHlwZSYgdmFsdWUpIHsKICAgICAgIHNldEFsbCh2YWx1ZSk7CiAgICB9CiAgICB2b2lkIHNldEFsbChjb25zdCB2YWx1ZV90eXBlJiB2YWx1ZSkgewogICAgICAgZm9yX2VhY2godGhpcy0+ZGF0YSwgdGhpcy0+ZGF0YSArIHMxLCBbdmFsdWVdKG15QXJyYXk8VCxzMj4mIHYpIHsgdi5zZXRBbGwodmFsdWUpOyB9KTsKICAgIH0KfTsgIAoKaW50IG1haW4oKSB7CiAgbXlBcnJheTxteUFycmF5PG15QXJyYXk8aW50LDc+LDg+LDk+IGEoNyk7CiAgc3RkOjpjb3V0IDw8IGFbMF1bMF1bMF0gPDwgc3RkOjplbmRsOwogIHN0ZDo6Y291dCA8PCBhWzhdWzddWzZdIDw8IHN0ZDo6ZW5kbDsKfQ==