다음 코드 조각의 i와 같이 상수가 아닌 변수를 템플릿 인수로 전달하려고 하면 컴파일러에서 문제가 발생합니다. 오류:
<code class="cpp">template <int a> void modify() {} for (int i = 0; i < 10; i++) { modify<i>(); // error: 'i' cannot appear in constant-expression }</code>
오류 이유:
템플릿은 컴파일 중에 확장되므로 컴파일 시 인수를 평가해야 합니다. i가 루프 내에서 수정되므로 컴파일러는 컴파일 타임에 해당 값을 확인할 수 없으며 이로 인해 오류가 발생합니다.
대체 구현:
API 인터페이스를 변경하려면 다음 구현을 고려하세요.
<code class="cpp">#include <iostream> template<int i> void modify() { std::cout << "modify<" << i << ">" << std::endl; } template<int x, int to> struct static_for { void operator()() { modify<x>(); static_for<x+1,to>()(); } }; template<int to> struct static_for<to,to> { void operator()() {} }; int main() { static_for<0,10>()(); }</code>
이 버전은 반복을 에뮬레이션하기 위해 재귀를 활용합니다. 각 값(예: 수정<0>, 수정<1> 등)에 대한 특수 템플릿 함수를 인스턴스화하여 코드는 i=0에서 i=9까지 루프 동작을 시뮬레이션합니다.
Non -상수 템플릿 인수 해결:
가변 인수 VAR(함수 계산에 의해 결정됨)을 사용하여 수정을 호출하려면 다음과 같이 가변 매개변수가 있는 템플릿 함수를 사용하는 것이 좋습니다.
<code class="cpp">template <typename T> void modify(const T& x) { std::cout << "modify(" << x << ")" << std::endl; } int main() { auto VAR = ...; // computed from some functional process modify(VAR); }</code>
위 내용은 C에서 상수가 아닌 변수를 템플릿 인수로 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!