C에서 템플릿 인수는 컴파일 중에 컴파일러가 값을 결정해야 하기 때문에 상수 표현식으로 제한됩니다. 상수 표현식은 변수 및 함수 호출을 제외하고 컴파일 타임에 사용 가능한 정보만을 기반으로 평가할 수 있는 표현식입니다.
제공된 코드에서:
<code class="cpp">for(int i = 0; i < 10; i++) { modify<i>(); }</code>
템플릿 인수 i는 해당 값이 런타임 중에 평가되는 루프 카운터 변수에 따라 달라지므로 상수 표현식이 아닙니다. 따라서 컴파일러는 컴파일 타임에 i의 값을 확인할 수 없으며 오류가 발생합니다.
라이브러리 인터페이스를 수정하지 않고 목표를 달성하려면 템플릿 메타프로그래밍. 접근 방식은 다음과 같습니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!