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

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

Susan Sarandon
풀어 주다: 2024-10-29 08:53:30
원래의
701명이 탐색했습니다.

 Why can't I use a non-constant variable as a template argument in C  ?

상수가 아닌 템플릿 인수 수수께끼

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

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