C에서 템플릿 인수는 상수 표현식이어야 합니다. 이는 해당 값이 컴파일 타임에 알려져야 함을 의미합니다. 컴파일러는 이 컨텍스트에서 상수가 아닌 변수를 평가할 수 없습니다.
코드를 고려하세요.
<code class="cpp">template <int a> void modify(){}</code>
상수가 아닌 변수를 템플릿 인수로 전달하려면 다음과 같이 작성할 수 있습니다.
<code class="cpp">for(int i = 0; i < 10; i++) { modify<i>(); }</code>
그러나 컴파일러가 컴파일 타임에 i 값을 결정할 수 없기 때문에 오류가 발생합니다. 루프 본문은 i 값을 변경하여 여러 번 실행될 수 있습니다.
상수가 아닌 변수를 직접 전달하는 대신 템플릿 특수화를 사용하여 구현할 수 있습니다. 반복 호출:
<code class="cpp">#include <iostream> template<> void modify<0>() { std::cout << "modify<0>" << std::endl; } template<> void modify<1>() { std::cout << "modify<1>" << std::endl; } // ... template<int i> void modify() { std::cout << "modify<" << i << ">" << std::endl; modify<i+1>(); } int main() { modify<0>(); }</code>
컴파일 시 알 수 없는 값으로 수정을 호출하려면 템플릿 메타프로그래밍이라는 기술을 사용할 수 있습니다. 다음은 간단한 예입니다.
<code class="cpp">#include <tuple> template <std::tuple<int...>> struct TupleSize; template <int... Args> struct TupleSize<std::tuple<Args...>> { static const int value = sizeof...(Args); }; template <int N> void callModify(int i) { if constexpr (i < N) { modify<i>(); callModify<N>(i+1); } } int main() { int n = 10; callModify<TupleSize<std::make_tuple(1,2,3,4,5,6,7,8,9,10)>::value>(0); }</code>
이 예에서 callModify는 i에 대해 원하는 값 범위를 포함하는 튜플의 크기인 N 매개 변수를 사용합니다. 이 함수는 재귀적 메타프로그램을 사용하여 지정된 크기 N까지 수정하는 호출을 생성합니다.
위 내용은 C에서 상수가 아닌 변수를 템플릿 인수로 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!