// Изменяемый вариант, ограниченный длиной 10
// (начиная с Си++14 без копирования!!)
template <class T>
struct Array3
{
unsigned size = 0;
T data[10];
T* begin() { return data; }
T* end() { return data + size; }
const T* begin() const { return data; }
const T* end() const { return data + size; }
T& operator[](int i) { return data[i]; }
Array3() {}
constexpr Array3(const std::initializer_list<T>& x)
: size(x.size()) { std::copy(x.begin(), x.end(), data); }
};
using Row3 = Array3<int>;
using Matrix3 = Array3<Row3>;
int main()
{
int i;
std::cin >> i;
Matrix3 mtx = {
{ 1, i, 3 },
{ 10, 2*i, 30, 3*i, 50 },
{ 13 },
{ 100 }
};
mtx[1][4] = i * 6;
for (auto& u : mtx) {
for (auto& v : u) {
std::cout << v << ' ';
}
std::cout << std::endl;
}
return 0;
}
test.push_back(data0);
. чтобы обеспечить вариативность наследников, создается максимально абстрактный класс, описывающий все, что может понадобиться наследникам, в самой обобщенной форме.
ArrayData data0 = {{1, 2, 3}, 3};
. Он хотел избавиться от этой длины!