C에서 기본이 아닌 생성 가능 유형으로 작업할 때 std::array를 초기화하는 것은 특히 어려울 수 있습니다. 배열 크기가 템플릿 매개변수에 의해 결정되는 경우.
이 문제를 해결하기 위해 시퀀스 유형 및 생성기 개념을 활용하는 정교한 접근 방식을 도입합니다.
순차적인 정수의 시퀀스를 나타내는 템플릿 메타함수를 사용하여 seq라는 시퀀스 유형을 정의합니다.
<code class="cpp">template<int ... N> struct seq { using type = seq<N...>; static const std::size_t size = sizeof ... (N); template<int I> struct push_back : seq<N..., I> {}; };</code>
이 시퀀스를 사용하여 다음을 생성하는 생성기 genseq를 구성합니다. 길이가 증가하는 시퀀스:
<code class="cpp">template<int N> struct genseq : genseq<N-1>::type::template push_back<N-1> {}; template<> struct genseq<0> : seq<> {}; template<int N> using genseq_t = typename genseq<N>::type;</code>
시퀀스를 제 위치에 두고 동일한 값으로 초기화된 배열을 생성하기 위해 Repeat() 함수를 정의합니다.
<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 //note that (X, value) evaluates to value return {(N, value)...}; }</code>
기본값이 아닌 구성 가능한 유형의 std::array를 초기화하려면 원하는 값과 genseq_t
<code class="cpp">template<typename T, int N> void f(T value) { //genseq_t<N> is seq<0,1,...N-1> std::array<T, N>> items = repeat(value, genseq_t<N>{}); }</code>
이 솔루션은 std::array의 우아하고 효율적인 초기화를 보장하여 n이 큰 템플릿 매개변수일 때 번거로운 수동 반복의 필요성을 효과적으로 제거합니다.
위 내용은 템플릿 메타프로그래밍을 사용하여 기본값이 아닌 생성 가능한 std::array를 우아하게 초기화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!