Pytanie jest co tak naprawdę chcesz uzyskać - dynamiczne tablice o zdefiniowanym wymiarze, czy dynamiczne wymiary tablic.
To pierwsze ma większy sens, bo trudno mi sobie wyobrazić, jakie zastosowanie mogłaby mieć np. 16-sto wymiarowa tablica.
Pomijając jednak sensowność rozwiązań, proponuję jak poniżej.
Dla tablic dynamicznych, gdzie wymiary tablic ustalane są statycznie (domyślnie 1 wymiar)
#include
template
class array
{
std::vector > _arr;
public:
array& operator [](unsigned int i)
{
if (_arr.size() <= i)
{
_arr.insert(_arr.end(), i - _arr.size() + 1, array());
}
return _arr[i];
}
};
template
class array
{
std::vector _arr;
public:
T& operator [](unsigned int i)
{
if (_arr.size() <= i)
{
_arr.insert(_arr.end(), i - _arr.size() + 1, T());
}
return _arr[i];
}
};
gdzie tablice tworzone są i używane jak poniżej
array t1;
t1[1] = 10;
t1[4] = 13;
array t2;
t2[1][2][2] = 5;
t2[3][7][1] = 2;
A dla tablic o dynamicznym wymiarze, gdzie ustalana jest jedynie maksymalna ilość dopuszczalnych wymiarów (domyślnie 16)
#include
template
class array
{
std::vector > _arr;
T _val;
public:
array& operator [](unsigned int i)
{
if (_arr.size() <= i)
{
_arr.insert(_arr.end(), i - _arr.size() + 1, array());
}
return _arr[i];
}
operator T& () { return _val; }
T& operator = (const T& v) { _val = v; return _val; }
};
template
class array
{
std::vector _arr;
T _val;
public:
T& operator [](unsigned int i)
{
if (_arr.size() <= i)
{
_arr.insert(_arr.end(), i - _arr.size() + 1, T());
}
return _arr[i];
}
operator T& () { return _val; }
T& operator = (const T& v) { _val = v; return _val; }
};
gdzie tablice tworzone są i używane jak poniżej
array t1;
t1[1] = 5;
t1[4][8][3] = 13;
array t2;
t2[3][4] = 2;
t2[1][3][5][2][3] = 4;
Dla poprawności, szablony klasy array dla drugiego przypadku, należałoby uzupełnić o wszystkie operatory arytmetyczne i logiczne - obecnie zdefiniowano jedynie operator przypisania.
Pozdrawiam.