2013-11-03 15 views
6

Jak zainicjować zagnieżdżony (2D) std::array poprzez listę inicjalizującą?Lista inicjalizatorów do inicjalizacji elementu std :: array w postaci 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)...}} {} 
}; 

Klasa Block powinien móc zainicjować block członek jak poniżej:

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

Uwaga: Mamy zdolność do zainicjowania std::array bezpośrednio w C++ 11:

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

Używam gcc-4.9.0

+0

Dokonując 'block' prywatne i zapewniając konstruktor,' Block' teraz ISN” t agregat więcej. Ponieważ inicjatory z ustalonym stężeniem nigdy nie są wydedukowane, jedyną poprawną wartością zainicjowaną dla obiektu typu 'Blok <3,2>' jest teraz 'Blok <3,2> b {1,2,3,4,5,6}' – dyp

+0

Powróć do wersji, która ma sens dla odpowiedzi, a następnie zadać nowe pytanie. – Shog9

Odpowiedz

5

Reguły dla aparatów ortodontycznych są bardzo skomplikowane, jeśli chodzi o struktury zagnieżdżone.

Najprostszą formą w kodzie byłaby to:

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

że w zasadzie pomija wszelkie wewnętrzne szelki — te braki są dozwolone przez język.

Kolejna składnia, która jest nieco skomplikowane, jest to:

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

To wciąż pomija szelki, ale o ile Block i jako jej członek jest zaniepokojony, że jest w pełni usztywnione. Pomija klamry dla urządzenia array i jego członków.

A ten jest w pełni usztywnione:

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

To szelki dla wszystkich struktur wewnętrznych.

All forms compiles fine.

Zobacz inne moje odpowiedzi na szczegółowe wyjaśnienie:

1

może to być do czynienia z interpretacją średnia jest zbyt kapryśna z liczbą szelki wymaganych do zainicjowania std::array. Ta wersja w pełni usztywnione kompiluje bez problemów na GCC 4.8.1:

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

dziwo, ta wersja kompiluje też:

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

@MM. Nie ma problemu. Nadal nie ma dla mnie sensu. W każdym razie myślę, że twoja pierwsza próba powinna być legalna w C++ 14. – juanchopanza

Powiązane problemy