初始化列表,用于初始化2D std :: array成员

mas*_*oud 6 c++ arrays c++11

如何std::array通过初始化列表初始化嵌套(2D)?

template <std::size_t W, std::size_t H>
class Block
{
    std::array<std::array<int, W>, H> block;
public:

    template <typename ...E>
    Block(E&&...e) : block {{std::forward<E>(e)...}} {}
};
Run Code Online (Sandbox Code Playgroud)

该类Block应该能够初始化block成员,如下所示:

Block<3, 2> b {{ {1, 2, 3}, {4, 5, 6} }};
Run Code Online (Sandbox Code Playgroud)

注意:我们可以std::array直接在C++ 11中初始化:

std::array<std::array<int, 3>, 2> b {{ {1, 2, 3}, {4, 5, 6} }};
Run Code Online (Sandbox Code Playgroud)

我正在使用gcc-4.9.0

Naw*_*waz 5

当涉及到嵌套结构时,大括号的规则非常复杂.

代码中最简单的形式是:

Block<3, 2> b {1, 2, 3, 4, 5, 6};
Run Code Online (Sandbox Code Playgroud)

这基本上省略了所有内部括号 - 语言允许这些遗漏.

下一个稍微复杂的语法是这样的:

Block<3, 2> b {{1, 2, 3, 4, 5, 6}};
Run Code Online (Sandbox Code Playgroud)

它仍然省略了大括号,但就Block其成员而言,它是完全支撑的.它省略了array它及其成员的大括号.

这一个是完全支撑:

Block<3, 2> b {{{ {{1, 2,3}}, {{4,5,6}} }}}; 
Run Code Online (Sandbox Code Playgroud)

它支撑所有内部结构.

所有表格都很好.

有关详细说明,请参阅我的其他答案