"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C++에서 상수가 아닌 변수를 템플릿 인수로 사용할 수 없는 이유는 무엇입니까?

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

2025-01-12에 게시됨
검색:643

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

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

C에서 템플릿 인수는 상수 표현식이어야 합니다. 이는 해당 값이 컴파일 타임에 알려져야 함을 의미합니다. 컴파일러는 이 컨텍스트에서 상수가 아닌 변수를 평가할 수 없습니다.

다음 코드를 고려하세요.

template 
void modify(){}

상수가 아닌 변수를 템플릿 인수로 전달하려면 다음과 같이 작성할 수 있습니다.

for(int i = 0; i ();
}

그러나 컴파일러가 컴파일 타임에 i 값을 결정할 수 없기 때문에 오류가 발생합니다. 루프 본문은 i 값을 변경하여 여러 번 실행될 수 있습니다.

API를 수정하지 않고 목표 달성

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

#include 

template
void modify() { std::cout " 
void modify() { std::cout " 
void modify() {
    std::cout " ();
}

int main() {
    modify();
}

동적 값으로 수정 호출

컴파일 시 알 수 없는 값으로 수정을 호출하려면 템플릿 메타프로그래밍이라는 기술을 사용할 수 있습니다. 다음은 간단한 예입니다.

#include 

template <:tuple>>
struct TupleSize;

template 
struct TupleSize<:tuple>> {
    static const int value = sizeof...(Args);
};

template 
void callModify(int i) {
    if constexpr (i ();
        callModify(i 1);
    }
}

int main() {
    int n = 10;
    callModify::value>(0);
}

이 예에서 callModify는 i에 대해 원하는 값 범위를 포함하는 튜플의 크기인 N 매개변수를 사용합니다. 이 함수는 재귀 메타 프로그램을 사용하여 지정된 크기 N까지 수정하는 호출을 생성합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3