> 백엔드 개발 > C++ > 본문

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

Patricia Arquette
풀어 주다: 2024-10-29 18:42:00
원래의
326명이 탐색했습니다.

Why Can't Non-Constant Variables Be Used as Template Arguments in C  ?

상수가 아닌 변수를 템플릿 인수로 전달할 수 없는 이유는 무엇입니까?

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 값을 변경하여 여러 번 실행될 수 있습니다.

API 수정 없이 목표 달성

상수가 아닌 변수를 직접 전달하는 대신 템플릿 특수화를 사용하여 구현할 수 있습니다. 반복 호출:

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

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