> 백엔드 개발 > C++ > 본문

템플릿 메타프로그래밍을 사용하여 기본값이 아닌 생성 가능한 std::array를 우아하게 초기화하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-10-28 04:59:01
원래의
762명이 탐색했습니다.

How to Initialize Non-Default Constructible std::array Elegantly with Template Metaprogramming?

기본값이 아닌 생성 가능 std::array를 우아하게 초기화

C에서 기본이 아닌 생성 가능 유형으로 작업할 때 std::array를 초기화하는 것은 특히 어려울 수 있습니다. 배열 크기가 템플릿 매개변수에 의해 결정되는 경우.

이 문제를 해결하기 위해 시퀀스 유형 및 생성기 개념을 활용하는 정교한 접근 방식을 도입합니다.

시퀀스 유형 seq

순차적인 정수의 시퀀스를 나타내는 템플릿 메타함수를 사용하여 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>
로그인 후 복사

Generator genseq

이 시퀀스를 사용하여 다음을 생성하는 생성기 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() 함수

시퀀스를 제 위치에 두고 동일한 값으로 초기화된 배열을 생성하기 위해 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에 의해 생성된 시퀀스를 사용하여 단순히peat()를 호출하면 됩니다.

<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!