mobile menu

The Arrow Newsletter

mobile menu

c++ template 예제

예를 들어 템플릿 인수 형식의 매개 변수가 없는 함수 템플릿을 호출하거나 올바른 함수 템플릿을 선택하기 전에 컴파일러가 인수에 대한 특정 승격을 수행하도록 강제할 수 있습니다. 이러한 경우 함수 템플릿의 인스턴스화를 호출해야 하는 컴파일러를 명시적으로 알려야 합니다. 마찬가지로 T 형식은 자체를 두 배로 변환할 수 있어야 합니다(return 문 참조). 나는 나중에, 이 핵심을 은폐 할 것이다. 더 나은 이해를 위해 T 형식의 필요한 지원을 다시 나열하고 있습니다 (이제 GetAverage 함수 템플릿에만 적용 가능): 메서드 템플릿을 사용하는 `명시적 템플릿 인수 사양`도 가능합니다. 또 다른 예를 들어, 마지막 두 가지는 명시적 템플릿 인수 사양이 맞는 힌트를 제공하기 위해 완성도를 위해 단순화된 예제일 뿐입니다. 이 명시성이 필요하고 다음 부분에서 다룰 보다 구체적인 시나리오가 있습니다. 첫 번째 클래스 템플릿 항목에는 템플릿 유형이 하나만 있었습니다. 이제 두 개의 템플릿 형식 인수가 있는 클래스를 만들어 보겠습니다. 다시 말하지만, 다소 복잡한 클래스 템플릿 예제가있을 수 있습니다. 벡터와 같은 각 컨테이너의 단일 정의가 있지만 벡터 벡터 등 다양한 종류의 벡터를 정의할 수 있습니다. 일반적으로 메타 프로그래밍, 정적 어설션, SFINAE 등과 같은 고급 항목용 템플릿을 사용하지 않는 한 비형식 정수 매개 변수에 대한 기본 사양을 사용하지 않습니다.

데이터 형식인 클래스 템플릿에 대한 기본 매개 변수를 더 자주 보고 구현합니다. 예: 개체, point2 또는 point1 중 하나의 템플릿 형식 매개 변수를 변경하면 point1 개체를 사용하여 복사-생성할 수 없습니다. 다음은 오류일 것입니다: 함수 템플릿, 클래스 템플릿 및 C++14 이후의 변수 템플릿의 세 가지 종류의 템플릿이 있습니다. C++11이기 때문에 템플릿은 변종또는 비변종일 수 있습니다. 이전 버전의 C++에서는 항상 비변종입니다. 함수 템플릿 (Add)의 본문을 보면서 컴파일러는 T (템플릿 형식 매개 변수)가 올바른지 아닌지 볼 수 없습니다. 단순히 기본 구문(예: 세미콜론, 키워드의 적절한 사용, 일치 하는 중괄호 등)을 확인 하 고 이러한 기본 검사에 대 한 오류를 보고 합니다. 다시 말하지만, 템플릿 코드를 처리하는 방법을 컴파일러에 따라 달라지지만 템플릿 형식 매개 변수로 인해 발생하는 오류를 보고하지 는 않습니다. C++ 템플릿에 대한 주요 영감은 CLU에서 제공하는 매개 변수화된 모듈과 Ada에서 제공하는 제네릭이었습니다. [1] 그 이유는 이론적으로 함수 템플릿이 데이터 멤버또는 iterator라는 멤버 함수가 있는 형식으로 호출될 수 있기 때문입니다. 컴파일러가 템플릿을 구문 분석할 때 나중에 제공되는 코드에 의해 전달될 형식에 대해 아무 것도 알지 못합니다. 즉, 컴파일러가 컨테이너가 무엇이고 어떤 멤버가 있는지 알 때까지 는 Container::iterator가 형식인지 여부를 알 수 없습니다.

실제로 C++의 규칙은 달리 말할 때까지 컴파일러는 Container::iterator가 형식이 아니라고 가정해야 한다고 말합니다. 해결책은 컴파일러에 형식 이름 키워드를 통해 힌트를 제공하는 것입니다: 이 클래스 템플릿 선언에서 int SIZE는 정수인 형식이 아닌 인수입니다. “템플릿 typedefs”제안은 프록시 트릭을 불필요하게 만드는 형식과 마찬가지로 템플릿을 재정의 할 수 있습니다. 그때까지, 위와 같은 것을 사용하십시오. file main.cpp가 foo()를 호출하여 이 템플릿 함수를 사용한다고 가정합니다: 지정된 형식 쌍으로 swap()를 사용할 때마다 컴파일러는 위의 정의로 이동하여 위의 인스턴스화로 또 다른 “템플릿 함수”를 만듭니다.