>  기사  >  백엔드 개발  >  컴파일 타임에 인수를 알 수 없는 경우 템플릿 인수로 지속적인 평가를 달성하려면 어떻게 해야 합니까?

컴파일 타임에 인수를 알 수 없는 경우 템플릿 인수로 지속적인 평가를 달성하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-03 10:05:291002검색

How Can I Achieve Constant Evaluation with Template Arguments When the Argument Is Not Known at Compile Time?

템플릿 인수 상수 평가

1. 컴파일러가 컴파일 타임에 'i'를 평가할 수 없는 이유는 무엇입니까?

컴파일 타임 평가에서는 프로그램이 실행되기 전에 'i' 값을 알아야 합니다. 그러나 제공된 코드에서 'i'는 프로그램 실행 중에 변경되는 루프 변수입니다. 'i' 값은 동적으로 할당된 값이므로 컴파일러는 컴파일 타임에 값을 결정할 수 없습니다.

2. API 인터페이스를 수정하지 않고도 목표를 달성할 수 있습니까?

예, 템플릿 특수화를 사용하여 템플릿 인수 범위를 반복하는 재귀 함수를 생성할 수 있습니다. 예를 들어, 다음과 같은 함수를 생성할 수 있습니다.

<code class="cpp">template<int i>
void modify_recursive() {
    // Call modify with template argument 'i'
    modify<i>();
    
    // Recursively call modify_recursive with the next template argument
    if (i < 10) {
        modify_recursive<i + 1>();
    }
}</code>

비상수 인수로 'modify' 호출

다음과 같은 값으로 'modify'를 호출하려면 컴파일 타임 상수가 아닌 경우 템플릿 메타 프로그래밍이라는 기술을 사용할 수 있습니다. 한 가지 접근 방식은 함수 개체를 인수로 사용하고 이를 원하는 값으로 호출하는 템플릿 클래스를 만드는 것입니다.

<code class="cpp">template<typename F>
struct InvokeWithParam {
    InvokeWithParam(F f, int param) : f(f), param(param) {}
    
    void operator()() { f(param); }
    
    F f;
    int param;
};</code>

그런 다음 InvokeWithParam의 인스턴스를 수정할 템플릿 인수로 전달할 수 있습니다.

<code class="cpp">int var = 5;
modify<InvokeWithParam{modify, var}>();</code>

이렇게 하면 var 값으로 수정 함수가 호출됩니다.

위 내용은 컴파일 타임에 인수를 알 수 없는 경우 템플릿 인수로 지속적인 평가를 달성하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.