如何通过初始化列表初始化嵌套的 (2D) std::array
?
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)...}} {}
};
类 Block
应该能够初始化 block
成员,如下所示:
Block<3, 2> b {{ {1, 2, 3}, {4, 5, 6} }};
注意:我们可以在 C++11 中直接初始化 std::array
:
std::array<std::array<int, 3>, 2> b {{ {1, 2, 3}, {4, 5, 6} }};
我正在使用 gcc-4.9.0
最佳答案
当涉及到嵌套结构时,大括号的规则非常复杂。
代码中最简单的形式是这样的:
Block<3, 2> b {1, 2, 3, 4, 5, 6};
这基本上省略了所有内括号——语言允许这些省略。
下一个稍微复杂的语法是这样的:
Block<3, 2> b {{1, 2, 3, 4, 5, 6}};
它仍然省略大括号,但就 Block
而言,就其成员而言,它是完全大括号的。它省略了 array
及其成员的大括号。
这一个是完全支撑的:
Block<3, 2> b {{{ {{1, 2,3}}, {{4,5,6}} }}};
它支撑所有内部结构。
详细解释见我的另一个回答:
关于c++ - 用于初始化 2D std::array 成员的初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19756652/