我需要一个多维数组,并且想使用现代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类只是具有x
和y
的结构,以及一些转换和数学运算符,以及带有x
和y
的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...
)?
其他:否,绝招,使编译器仍然可以检查多值错误等。