2010-07-22 3 views
8

템플릿 클래스의 C++ 0x std :: array 멤버가 있고 두 개의 이터레이터가 필요한 생성자를 사용하여 초기화하려고한다고 가정 해 보겠습니다.std :: array의 초기화에

template <typename Tp, size_t N> 
class Test 
{ 
public: 
    template <typename Iterator> 
    Test(Iterator first, Iterator last) 
    { 
     if (std::distance(first,last) > N) 
      throw std::runtime_error("bad range"); 
     std::copy(first, last, _M_storage.begin()); 
    } 

private: 
    std::array<Tp, N> _M_storage; 

}; 

저장소의 크기와 일치하는 범위를 제공한다고 가정하면 저장소에 Tps라는 초소형 기본 생성자를 피하면서 생성자 이니셜 라이저에서 std :: array를 초기화 할 수 있습니까? 이 경우 std :: initializer_list <>을 악용 할 수 있습니까? 제

std::array

+1

그런데 밑줄로 시작하고 뒤에 대문자가 오는 식별자는 예약되어 있습니다. 또한'std :: distance (first, last)'여야합니다. – GManNickG

+0

감시가 고정되었습니다. 추가 기본 생성자의 문제는 여전히 남아 있습니다. –

답변

3

는 집계입니다, 그래서 당신은 반복자를 복용 생성자 같은 특별한 기능을 얻을 수 없습니다. (이것은 실제로 놀랍지 만 std::initializer_list의 도입으로 다른 유용한 생성자를 만드는 데 아무런 해가되지 않을 것입니다. 아마도 질문이 있습니다.)

이는 반복기를 사용하여 반복자를 사용하여 데이터를 복사하는 유일한 방법이라는 것을 의미합니다 , 그리고 그렇게하려면 array이 이미 구성되어 있고 사용할 준비가되어 있어야합니다.

관련 문제