使用T[][][]
语法定义多维数组非常简单。但是,这会创建一个原始数组类型,它不适合现代C ++。这就是我们从C ++ 11开始std::array
的原因。但是使用std::array
定义多维数组的语法非常混乱。例如,要定义三维int
数组,您必须编写std::array<std::array<std::array<int, 5>, 5>, 5>
。语法根本不可扩展。我要求解决这个问题。也许,使用C ++提供的现有实用程序无法修复此问题。在这种情况下,我很高兴开发了一种用于简化语法的自定义工具。
自己找到solution:
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;
想知道是否可以进一步简化实施。
答案 0 :(得分:9)
请参阅Multi-dimensional arrays in 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
是一对元函数,用于计算多维std::array
的嵌套类型。最通用的MultiDimArray
是无符号整数的可变参数模板,用于传递任意数量的维度。终止MultiDimArray
专门化定义了单维std::array
的最简单的情况。