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

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

Susan Sarandon
Susan Sarandon원래의
2024-10-27 20:17:011018검색

 How to Elegantly Initialize `std::array` with Non-Default Constructible Types in C  ?

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

C 영역에서는 std::array 고정 크기 배열을 처리하는 편리한 방법을 제공합니다. 그러나 배열 내의 요소를 초기화하는 것은 기본 생성자가 없는 유형을 처리할 때 문제가 됩니다.

다음 코드 조각을 고려하세요.

<code class="cpp">template<typename T, int N>
void f(T value)
{
    std::array<T, N> items = {value, value, value, value, value};
}</code>

간단하지만 값을 수동으로 반복하는 것은 다음과 같이 지루합니다. N이 증가합니다. 이 문제를 해결하기 위한 보다 우아한 접근 방식은 C 17의 구조화된 바인딩과 가변 템플릿을 활용하는 것입니다.

시퀀스 생성기와 반복 기능 활용

이 우아한 방식의 핵심 해결책은 시퀀스 유형 seq을 생성하는 데 있습니다. genseq_t<> 발전기. 이 시퀀스 유형을 사용하면 값과 생성된 시퀀스를 매개변수로 사용하고 std::array 반복되는 값으로 채워집니다.

구현예

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

패턴 세부정보

  • genseq_t< ;N>::type은 0부터 N-1까지의 시퀀스 유형을 나타냅니다.
  • repeat(value, seq)은 다음과 같이 평가됩니다. std::array 각 요소는 값으로 초기화됩니다.

이 기술을 사용하면 std::array T에 기본 생성자가 없는 경우에도 마찬가지입니다.

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

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