2017-10-23 1 views
3

명명 된 생성자 이디엄 인 이 make_foo()이라고 가정 해 보겠습니다. 이제 정확히 123 개의 foo를 갖고 싶습니다. 그래서 std::array<foo_t, 123>에 대해 생각하고 있습니다.기본이 아닌 구성 가능한 요소의 std :: array를 초기화 하시겠습니까?

std::array<foo_t, 123> pity_the_foos; 
std::generate(
    std::begin(pity_the_foos), std::end(pity_the_foos), 
    []() { return make_foo(); } 
); 

을 밥의 삼촌, 오른쪽 : 이제 foo_t은 기본적으로 작도 인 경우에, 나는 쓸 것인가? 아쉽게도 ... foo_t에는 기본 ctor가 없습니다.

배열을 어떻게 초기화해야합니까? 아마도 몇 가지 가변적 인 템플릿 확장 부두를 사용해야합니까?

참고 : 답변을 C++ 11, C++ 14 또는 C++ 17에서 사용할 수 있습니다.

+0

이 내용이 도움이 될 예정입니까? https://stackoverflow.com/a/19016627/8414561 –

+0

@DevNull : 그렇습니다.하지만 그 배열 생성기 스 니펫은 얼마나 관용적입니까? – einpoklum

+0

"관용"을 정의 하시겠습니까? :) –

답변

8

평소와 다릅니다.

template<size_t...Is> 
std::array<foo_t, sizeof...(Is)> make_foos(std::index_sequence<Is...>) { 
    return { ((void)Is, make_foo())... }; 
} 

template<size_t N> 
std::array<foo_t, N> make_foos() { 
    return make_foos(std::make_index_sequence<N>()); 
} 
+0

그 인덱스 시퀀스는 계속 나타나지 않습니다. 그렇지만, 실제로, 필자의 경우에는 정수 시퀀스가 ​​필요하지 않습니다. 길이 N – einpoklum

관련 문제