unidimensionales tipos que matrices cadenas bidimensionales arreglos arreglo c++ arrays multidimensional-array c++14 template-meta-programming

tipos - Elegir elegantemente matriz multidimensional en C++ moderno



que es un arreglo en c++ (1)

Definir una matriz multidimensional usando la sintaxis T[][][] es fácil. Sin embargo, esto crea un tipo de matriz sin formato que no encaja bien en el C ++ moderno. Es por eso que tenemos std::array desde C ++ 11. Pero la sintaxis para definir una matriz multidimensional utilizando std::array es bastante complicada. Por ejemplo, para definir una matriz int tridimensional, tendría que escribir std::array<std::array<std::array<int, 5>, 5>, 5> . La sintaxis no se escala en absoluto. Estoy pidiendo una solución para este problema. Tal vez, este problema no puede solucionarse utilizando la utilidad existente proporcionada por C ++. En ese caso, estoy contento con una herramienta personalizada desarrollada para facilitar la sintaxis.

Encontré una solution yo mismo:

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;

Preguntándose si la implementación se puede simplificar aún más.


Consulte matrices multidimensionales en C ++ 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 es un par de funciones meta para calcular el tipo anidado para std::array multidimensional. El MultiDimArray más general es una plantilla variada de enteros sin signo para pasar un número arbitrario de dimensiones. La especialización de terminación de MultiDimArray define el caso más simple de unidimensional std::array .