【发布时间】:2018-12-02 16:16:29
【问题描述】:
这是一个简单的二维 C 样式数组示例:
int c[2][2] = {
{ 1, 2 },
{ 3, 4 }
};
如果我希望这是std::array,我必须使用它:
std::array<std::array<int, 2>, 2> c = {
{ { 1, 2 } },
{ { 3, 4 } }
};
声明比较复杂,我必须使用额外的{}进行初始化。
是否可以创建一个 C 风格的数组包装器,我可以用它来做到这一点?
my_array<int, 2, 2> c = {
{ 1, 2 },
{ 3, 4 }
};
所以声明更简单,不需要额外的{}。
如果可以创建这样的东西,与std::array相比,这个解决方案是否有一些缺点?
我已经做到了:
template <typename T, std::size_t ...S>
struct ArrayTypeHelper;
template <typename T, std::size_t HEAD, std::size_t ...TAIL>
struct ArrayTypeHelper<T, HEAD, TAIL...> {
using Type = typename ArrayTypeHelper<T, TAIL...>::Type[HEAD];
};
template <typename T, std::size_t HEAD>
struct ArrayTypeHelper<T, HEAD> {
using Type = T[HEAD];
};
template <typename T, std::size_t ...S>
struct my_array {
typename ArrayTypeHelper<T, S...>::Type data;
};
但这仍然需要额外的{}:
my_array<int, 2, 2> b = { {
{ 1, 2 },
{ 3, 4 }
} };
【问题讨论】:
-
std::array<std::array<int, 2>, 2> c{1, 2, 3, 4};怎么样? -
使用 C++17 可以更简单,因为它可以从初始化中推断出模板参数。
-
@VTT:我不太喜欢这种风格。并且有些编译器会对此发出警告。
-
@geza 我猜“一些编译器”是指clang?然后是known bug。您仍然可以将每一行保留在单独的行上,使其看起来像矩阵