在现代C ++中优雅地定义多维数组

时间:2016-01-26 06:25:24

标签: c++ arrays multidimensional-array c++14 template-meta-programming

使用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;

想知道是否可以进一步简化实施。

1 个答案:

答案 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的最简单的情况。