2011-04-30 7 views
6

C++ 0x 새 초기화 프로그램 목록 기능을 사용하여 현재 작업중인 새 API에 대해 컴파일 타임에 정의 된 항목 수를 사용하여 std :: vector를 초기화하고 싶습니다. 다음과 같이 입력하십시오 :C++ 0x 중첩 된 이니셜 라이저 목록

template<int n> 
std::initializer_list<std::string> duplicate(std::string s) { 
    // return s duplicated n times 
    return { s, s, s }; 
} 

std::vector<std::string> v = { "foo", duplicate<3>("bar") }; 

이것을 수행하는 방법에 대해 알고 있습니까? 심지어 가능할까요? 나는 TMP와 재귀를 사용하여 복제 된 문자열의 목록을 만들고 마지막으로 상수 (예 : 열거 형)를 통해 액세스 할 필요가 있음을 알고 있습니다. 하지만 이니셜 라이저 목록을 이와 같이 중첩시킬 수없는 것 같습니다.

답변

8

이니셜 라이저 목록을 확장하기 위해 중첩 할 수 없으며 추가하거나 연결할 수도 없습니다. 그것들은 컴파일 타임 크기의 배열에 접근하기위한 약간의 문법적 설탕 일뿐입니다. initializer_lists 복사도 항목을 복사하지 않습니다. 가장 중요한 것은 중복의 반환 값을 사용할 수 없다는 것을 의미합니다! 함수가 반환 될 때 참조 된 배열은 N3290의 8.5.4p6에 따라 소멸됩니다.

배열의 수명은 initializer_list 개체의 수명과 같습니다.

(임시가 return 문에서 생성 된 다음 값이 반환됩니다. 복사 생략이 발생하더라도, 복사의 다른 의미는 변경되지 않습니다.)

예를 들어, 임시 initializer_list 생성에 비교 여기에 파괴 될 것이다 (어떤이 있다면) 같은 전체 표현의 다른 모든 임시 개체를, 이는 다음의 ctor에 전달되고 객체가 초기화 된 후 동일한 지점에서 파괴 :

vector<string> v {"foo"}; 

을 대신 조작의 이니셜 라이저 목록, 벡터의 방법 사용 N 사본을 삽입하려면 :

v.insert(v.end(), 3, "bar"); 
관련 문제