Элегантно определить многомерный массив в современном С++
Определение многомерного массива с использованием синтаксиса T[][][]
очень просто. Однако это создает тип необработанного массива, который не очень хорошо вписывается в современный С++. Вот почему мы имеем std::array
с С++ 11. Но синтаксис для определения многомерного массива с использованием std::array
довольно грязный. Например, чтобы определить трехмерный массив int
, вам нужно написать std::array<std::array<std::array<int, 5>, 5>, 5>
. Синтаксис вообще не масштабируется. Я прошу исправить эту проблему. Возможно, эта проблема не может быть исправлена с использованием существующей утилиты, предоставляемой С++. В этом случае я доволен специальным инструментом, разработанным для упрощения синтаксиса.
Нашел :
template <typename T, std::size_t n, std::size_t... ns>
struct multi_array {
using type = std::array<typename multi_array<T, ns...>::type, n>;
};
template <typename T, std::size_t n>
struct multi_array<T, n> {
using type = std::array<T, n>;
};
template <typename T, std::size_t... ns>
using multi_array_t = typename multi_array<T, ns...>::type;
Интересно, можно ли упростить реализацию.
Ответы
Ответ 1
Обратитесь к Многомерные массивы в С++ 11
template <class T, std::size_t I, std::size_t... J>
struct MultiDimArray
{
using Nested = typename MultiDimArray<T, J...>::type;
// typedef typename MultiDimArray<T, J...>::type Nested;
using type = std::array<Nested, I>;
// typedef std::array<Nested, I> type;
};
template <class T, std::size_t I>
struct MultiDimArray<T, I>
{
using type = std::array<T, I>;
// typedef std::array<T, I> type;
};
MultiDimArray<float, 3, 4, 5, 6, 7>::type floats;
MultiDimArray
- пара мета-функций для вычисления вложенного типа для многомерного std::array
. Наиболее общим MultiDimArray
является вариационный шаблон беззнаковых целых чисел для передачи произвольного количества измерений. Оканчивающаяся специализация MultiDimArray
определяет простейший случай одномерного std::array
.