7

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)...}} {}
};

クラスは、以下のようにメンバーBlockを初期化できる必要があります。block

Block<3, 2> b {{ {1, 2, 3}, {4, 5, 6} }};

注: std::arrayC++11 で直接初期化する機能があります。

std::array<std::array<int, 3>, 2> b {{ {1, 2, 3}, {4, 5, 6} }};

私はgcc-4.9.0を使用しています

4

2 に答える 2

6

ネストされた構造に関しては、ブレースの規則は非常に複雑です。

コードの最も単純な形式は次のようになります。

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}} }}}; 

すべての内部構造を支えます。

すべてのフォームは正常にコンパイルされます

詳細な説明については、他の回答を参照してください。

于 2013-11-03T19:05:01.533 に答える
1

初期化に必要な中括弧の数が過度に気まぐれであるという標準の解釈に関係している可能性がありますstd::array。この完全に括弧付きのバージョンは、GCC 4.8.1 で問題なくコンパイルされます。

Block<3, 2> b {
               {
                { 
                 { {1, 2, 3} }, { {4, 5, 6} } 
                }
               }
              }; 

奇妙なことに、このバージョンもコンパイルされます。

  Block<3, 2> b { 
                 {{ {1, 2, 3}, {4, 5, 6} } }
                };
于 2013-11-03T19:05:17.107 に答える