如何在c++11中为多维数组使用容器std::array<type, size>?

How to use the container std::array<type, size> for multidimensional array in c++11?

一维数组,例如包含三个整数的数组,可以定义为 std::array<int, 3> myarraymyarray[3]。对于像myarray[3][3]这样的多维数组,是否有像std::array<type, size>这样的容器?

This 应该有效:

template<typename T, std::size_t Size, std::size_t ...Sizes>
struct MultiArray : public std::array<MultiArray<T, Sizes...>, Size>
{
};

template<typename T, std::size_t Size>
struct MultiArray<T, Size> : public std::array<T, Size>
{
};

int main()
{
    MultiArray<int, 3, 6, 8> ma;

    std::cout << ma.size() << std::endl;
    std::cout << ma[0].size() << std::endl;
    std::cout << ma[0][0].size() << std::endl;

    ma[2][1][6] = 4;
}

一个关键部分是确保 {} 初始化像 std::array 一样工作,并尽可能保持自己像 pod 一样合理。与 std::array 的兼容性也很重要,还有什么比 std::array 更兼容?所以我的解决方案从 std::arrays:

生成多维数组
template<class T, size_t... sizes>
struct multi_array_helper {
  using type=T;
};
template<class T, size_t... sizes>
using multi_array = typename multi_array_helper<T, sizes...>::type;

template<class T, size_t s0, size_t... sizes>
struct multi_array_helper<T, s0, sizes...> {
  using type=std::array<multi_array<T, sizes...>, s0>;
};

live example

示例语法:

multi_array<int, 2,2> arr = {{ {{0,1}}, {{2,3}} }};
static_assert( std::is_same< multi_array<int,2,2>, std::array<std::array<int,2>,2> >{}, "see, just arrays under the hood" );

如果维度为 0,则稍微优化可能涉及折叠整个数组层次结构,但我不确定。

A multi_array<int> 是一个 int 作为旁白(int 的零维数组),既因为它有意义,也因为它使代码更简单。


这是一个old version.