>  기사  >  백엔드 개발  >  기본이 아닌 생성 가능 유형에 대해 `std::array`를 우아하게 초기화하는 방법은 무엇입니까?

기본이 아닌 생성 가능 유형에 대해 `std::array`를 우아하게 초기화하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-30 09:53:27522검색

How to Initialize `std::array` for Non-Default Constructible Types Elegantly?

std::array의 우아한 초기화 기본이 아닌 생성 가능 유형의 경우

이러한 맥락에서 포함된 유형(T)에 기본 생성자가 없으면 std::array를 초기화하는 것이 어려울 수 있습니다. 일반적인 해결 방법은 값을 수동으로 반복하여 배열을 채우는 것입니다. 이는 큰 n 값에 대해 지루하고 오류가 발생하기 쉬운 프로세스입니다.

다행히도 시퀀스 유형과 사용자 정의 반복 기능의 조합을 사용하는 보다 우아한 접근 방식이 있습니다. 다음 코드를 고려해보세요.

<code class="cpp">template<typename T, int N>
void f(T value)
{
    // Generate a sequence of numbers: 0, 1, ..., N-1
    using genseq_t = genseq_t<N>;
    std::array<T, N> items = repeat(value, genseq_t{});
}</code>

genseq_t 유형은 0에서 N-1까지의 숫자 시퀀스를 나타내며, 반복 함수는 값과 시퀀스를 가져와 해당 값으로 채워진 배열을 반환합니다.

반복 함수의 구현에는 시퀀스를 풀고 값을 반복하는 작업이 포함됩니다. 간결한 구문을 사용하여 각 요소에 대해:

<code class="cpp">template<typename T, int...N>
auto repeat(T value, seq<N...>) -> std::array<T, sizeof...(N)>
{
    // Unpack N, repeating 'value' sizeof...(N) times
    return {(N, value)...};
}</code>

genseq_t 유형은 시퀀스를 생성하기 위해 push_back 작업을 사용하여 재귀적으로 정의됩니다.

<code class="cpp">template<int N>
struct genseq : genseq<N - 1>::type::template push_back<N - 1> {};</code>

사용자 정의 시퀀스 및 반복 기능은 유연한 std::array을 초기화하기 위한 우아한 솔루션입니다. 기본이 아닌 구성 가능 유형을 사용합니다.

위 내용은 기본이 아닌 생성 가능 유형에 대해 `std::array`를 우아하게 초기화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.