#include #include #include #include template class MultiArrayBase { public: MultiArrayBase(T* data, const std::array& dim) : data_(data), dim_(dim) { next_ = std::accumulate(dim.begin()+1, dim.end(), 1L, std::multiplies()); } MultiArrayBase operator[](unsigned idx) { assert(idx < static_cast(dim_[0])); std::array dim; std::copy(dim_.begin()+1, dim_.end(), dim.begin()); MultiArrayBase result(data_ + idx * next_, dim); return result; } T* data_; size_t next_; const std::array dim_; }; template class MultiArrayBase { public: MultiArrayBase(T* data, const std::array& dim) : data_(data), next_(1), dim_(dim) { } T& operator[](unsigned idx) { assert(idx < dim_[0]); return data_[idx]; } T* const data_; const size_t next_; const std::array dim_; }; template class MultiArray : public MultiArrayBase { public: explicit MultiArray(const std::array& dim) : MultiArrayBase(nullptr, dim) { size_t sz = this->next_ * dim[0]; this->data_ = new T[sz](); } ~MultiArray() { delete[] this->data_; } private: // FIXME: MultiArray(const MultiArray&) = delete; void operator=(const MultiArray&) = delete; }; int main() { std::array dim3{4,5,3}; MultiArray arr3(dim3); int value = 0; for (int i = 0; i < dim3[0]; ++i) for (int j = 0; j < dim3[1]; ++j) for (int k = 0; k < dim3[2]; ++k) arr3[i][j][k] = 10.0 * ++value; for (int i = 0; i < dim3[0]; ++i) for (int j = 0; j < dim3[1]; ++j) for (int k = 0; k < dim3[2]; ++k) printf("%.1f\n", arr3[i][j][k]); arr3[3][5][2]; // fail }