> 백엔드 개발 > C++ > C에서 루프 변수를 템플릿 인수로 사용할 수 없는 이유는 무엇입니까?

C에서 루프 변수를 템플릿 인수로 사용할 수 없는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-10-31 01:09:02
원래의
515명이 탐색했습니다.

 Why Can't I Use a Loop Variable as a Template Argument in C  ?

템플릿 인수가 상수여야 하는 이유

C에서 템플릿 인수는 컴파일 중에 컴파일러가 값을 결정해야 하기 때문에 상수 표현식으로 제한됩니다. 상수 표현식은 변수 및 함수 호출을 제외하고 컴파일 타임에 사용 가능한 정보만을 기반으로 평가할 수 있는 표현식입니다.

오류 설명

제공된 코드에서:

<code class="cpp">for(int i = 0; i < 10; i++) {
    modify<i>();
}</code>
로그인 후 복사

템플릿 인수 i는 해당 값이 런타임 중에 평가되는 루프 카운터 변수에 따라 달라지므로 상수 표현식이 아닙니다. 따라서 컴파일러는 컴파일 타임에 i의 값을 확인할 수 없으며 오류가 발생합니다.

API를 변경하지 않는 대체 접근 방식

라이브러리 인터페이스를 수정하지 않고 목표를 달성하려면 템플릿 메타프로그래밍. 접근 방식은 다음과 같습니다.

<code class="cpp">template<int I = 1>
void modify_loop() {
    modify<I>();
    modify_loop<I + 1>();
}

// Call the recursive function with the starting value
modify_loop<>();</code>
로그인 후 복사
이 접근 방식은 기본값이 1로 설정된 수정 루프 템플릿 함수로 시작합니다. 함수 내에서 현재 I 값으로 수정을 호출한 다음 I로 자신을 재귀적으로 호출합니다. 증가. 원하는 값인 10에 도달할 때까지 반복이 계속됩니다.

함수 출력으로 수정 호출

VAR이 함수 계산의 출력인 경우 수정을 호출하려면 표현식 템플릿

. 예는 다음과 같습니다.

이 예에서 Func 구조체는 인수에 10을 더하는 함수 개체를 정의합니다. VAR 변수는 이 함수의 출력을 저장하고 수정 함수는 모든 유형의 템플릿 인수를 허용합니다. VAR로 수정을 인스턴스화하면 함수 결과를 인수로 효과적으로 전달할 수 있습니다.
<code class="cpp">struct Func {
    template<typename T>
    T operator()(T arg) { return arg + 10; }
};

constexpr auto VAR = Func()(); // Evaluate the function and store the result

template<typename Value>
void modify(Value arg) { ... }

// Call modify with VAR as the argument
modify(VAR);</code>
로그인 후 복사

위 내용은 C에서 루프 변수를 템플릿 인수로 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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