You can use a type alias template:
#include <array>
#include <cstddef>
template <class T, std::size_t x, std::size_t y>
using Array2D = std::array<std::array<T, y>, x>;
int main() {
Array2D<int, 5, 3> arr;
}
You can also generalize it like so for any dimension:
#include <array>
#include <cstddef>
template <class T, std::size_t size, std::size_t... sizes>
struct ArrayHelper {
using type = std::array<typename ArrayHelper<T, sizes...>::type, size>;
};
template <class T, std::size_t size>
struct ArrayHelper<T, size> {
using type = std::array<T, size>;
};
template <class T, std::size_t... sizes>
using Array = typename ArrayHelper<T, sizes...>::type;
int main() {
Array<int, 5, 3, 4, 3> arr;
}