优雅地定义现代C中的多维阵列

使用T [] [] []语法定义多维数组很容易。然而,这创建了一个不适合现代C的原始阵列类型。这就是为什么我们从C11开始有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;

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

参见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的最简单的例子。

http://stackoverflow.com/questions/35008089/elegantly-define-multi-dimensional-array-in-modern-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:优雅地定义现代C中的多维阵列