2013-11-03 2 views
6

중첩 된 (2D) std::array을 이니셜 라이저 목록을 통해 초기화하는 방법은 무엇입니까?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} }}; 

참고 :

std::array<std::array<int, 3>, 2> b {{ {1, 2, 3}, {4, 5, 6} }}; 
: 우리는 C++ (11)에 직접 std::array를 초기화 할 수있는 능력을 가지고

gcc-4.9.0을 사용하고 있습니다.

+0

개인 block'과의 ctor,'Block' 지금 외설을 '제공 더 이상 집합체가 아니다. braced-initializers가 결코 추론되지 않으므로'Block <3,2>'유형의 객체에 대해 초기화 된 유일한 유효한 객체는'Block <3,2> b {1,2,3,4,5,6}' – dyp

+0

입니다. 답변에 의미가있는 경우 새로운 질문을하십시오. – Shog9

답변

5

중괄호에 대한 규칙은 중첩 된 구조의 경우 매우 복잡합니다.

코드의 간단한 형식이 될 것이다 : 기본적으로 —이 누락 언어에 의해 허용되는 모든 내부 중괄호를 생략

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

.

All forms compiles fine. 그것은 표준 std::array를 초기화하는 데 필요한 중괄호의 수에 지나치게 변덕스러운 존재의 해석 할 수 있습니다

1

:

는 자세한 설명 내 다른 답변을 참조하십시오.

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

이상하게도,이 버전이 너무 컴파일 :이 완전히 보강 된 버전은 GCC 4.8.1에 문제없이 컴파일`함으로써

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

@MM. 문제 없어. 그것은 여전히 ​​나에게 어떤 의미가 없습니다. 어쨌든, 나는 당신의 첫 시도가 C++에서 합법적이어야한다고 생각한다. – juanchopanza