在C ++ 14中初始化多维std :: array

时间:2019-04-03 07:50:53

标签: c++ arrays initialization

我需要一个多维数组,并且想使用现代C ++(例如std::array来获取迭代器,大小,数据等)

我所使用的解决方案与Elegantly define multi-dimensional array in modern C++中的解决方案基本相同,但是使用的模板很好:

namespace detail {
    template<typename T, size_t T_n1, size_t... T_n>
    struct GetMultiArrayType
    {
        using type = std::array<typename GetMultiArrayType<T, T_n...>::type, T_n1>;
    };
    template<typename T, size_t T_n>
    struct GetMultiArrayType<T, T_n>
    {
        using type = std::array<T, T_n>;
    };
} // namespace detail

/// Wrapper around std::array to allow multi-dimensional fixed-size arrays
/// The declaration 'FooBar myVar[N1][N2][N3]' can be replaced with 'MultiArray<FooBar, N1, N2, N3> myVar'
template<typename T, size_t... T_n>
using MultiArray = typename detail::GetMultiArrayType<T, T_n...>::type;

到目前为止,一切都很好。但是现在初始化语法让我丧命:

我在代码中有很多常量,这些常量为例如Points定义了此类多数组。 Point类只是具有xy的结构,以及一些转换和数学运算符,以及带有xy的ctor。

使用C数组的旧代码如下:

const Point offsets[2][3] = {{{24, -41}, {19, -41}, {31, -88}},
                             {{-9, -49}, {14, -59}, {16, -63}, {0, -44}}};

这还可以。如果我要将C数组封装在类似std::array的类中,但是具有多个维度(struct MultiArrayRaw{ Point data[2][3]; ...};),则需要一对额外的花括号。 AFAIK大括号省略不适用于此处,因为我的“底部”类型是Point,它本身是一个聚合。所以看起来像这样:

const MultiArrayRaw<Point,2,3> offsets = {{{{24, -41}, {19, -41}, {31, -88}},
                             {{-9, -49}, {14, -59}, {16, -63}, {0, -44}}}};

这不是很好...但是,如果我使用MultiArray的{​​{1}}会变得更糟,在那里我还需要另外一对大括号。对于3D,4D ...阵列,情况更糟。

问题是:如何优雅地/可读地初始化ND常量集合(std::array<std::array...)?

其他:否,绝招,使编译器仍然可以检查多值错误等。

0 个答案:

没有答案