Подтвердить что ты не робот

Элегантно определить многомерный массив в современном С++

Определение многомерного массива с использованием синтаксиса 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;

Интересно, можно ли упростить реализацию.

4b9b3361

Ответ 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.