Namespaces
Variants

Templates

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

템플릿은 다음 중 하나를 정의하는 C++ 엔터티입니다:

(since C++11)
(C++14부터)
(C++20부터)

템플릿은 세 가지 종류의 template parameters , 즉 type template parameters, constant template parameters, 그리고 template template parameters 중 하나 이상으로 매개변수화됩니다.

템플릿 인자가 제공되거나, function class (since C++17) 템플릿의 경우에만 추론될 때, 이들은 템플릿 매개변수에 대입되어 템플릿의 specialization , 즉 특정 타입이나 특정 함수 lvalue를 얻습니다.

특수화는 명시적으로 제공될 수도 있습니다: 완전 특수화 는 클래스 , 변수 (C++14부터) 및 함수 템플릿에 허용되며, 부분 특수화 는 클래스 템플릿 및 변수 템플릿 (C++14부터) 에만 허용됩니다.

클래스 템플릿 특수화가 완전한 객체 타입을 요구하는 컨텍스트에서 참조되거나, 함수 템플릿 특수화가 함수 정의가 존재해야 하는 컨텍스트에서 참조될 때, 해당 템플릿은 이미 명시적으로 특수화되었거나 명시적으로 인스턴스화되지 않은 한 인스턴스화됩니다 (해당 코드가 실제로 컴파일됨). 클래스 템플릿의 인스턴스화는 해당 멤버 함수들도 사용되지 않는 한 어떤 멤버 함수도 인스턴스화하지 않습니다. 링크 타임에 서로 다른 번역 단위에서 생성된 동일한 인스턴스화들은 병합됩니다.

클래스 템플릿의 정의는 암시적 인스턴스화 지점에서 보여야 하므로, 템플릿 라이브러리는 일반적으로 모든 템플릿 정의를 헤더 파일에 제공합니다(예: 대부분의 Boost 라이브러리는 헤더-온리 방식입니다 ).

목차

구문

template < 매개변수-목록  > 요구사항-절  (선택사항) 선언 (1)
export template < 매개변수-목록  > 선언 (2) (C++11 이전)
template < 매개변수-목록  > concept 개념-이름 = 제약조건-표현식  ; (3) (C++20 이후)
parameter-list - 비어 있지 않은 쉼표로 구분된 템플릿 매개변수 목록으로, 각각은 상수 매개변수 , 타입 매개변수 , 템플릿 매개변수 , 또는 이들 중 하나의 매개변수 팩 (C++11부터) 입니다.
requires-clause - (C++20부터) 템플릿 인자에 대한 제약 조건 을 지정하는 requires-clause 입니다.
declaration - 클래스(구조체 및 공용체 포함) , 멤버 클래스 또는 멤버 열거형 타입 , 함수 또는 멤버 함수 , 네임스페이스 범위의 정적 데이터 멤버 , 클래스 범위의 변수 또는 정적 데이터 멤버 (C++14부터) , 또는 별칭 템플릿 (C++11부터) 의 선언입니다. 또한 템플릿 특수화 를 정의할 수도 있습니다.
concept-name
constraint-expression
- 제약 조건과 개념 참조

export 는 템플릿을 내보내진 것으로 선언하는 선택적 수정자였습니다(클래스 템플릿과 함께 사용될 때는 모든 멤버도 내보내진 것으로 선언됨). 내보내진 템플릿을 인스턴스화하는 파일들은 해당 정의를 포함할 필요가 없었습니다: 선언만으로 충분했습니다. export 의 구현은 드물었고 세부 사항에서 서로 일치하지 않았습니다.

(C++11까지)

템플릿 식별자

템플릿 식별자는 다음 구문 중 하나를 가집니다:

template-name  < template-argument-list  (선택 사항) > (1)
operator op  < template-argument-list  (선택 사항) > (2)
operator "" identifier < template-argument-list  (선택 사항) > (3) (C++11부터)
(사용 중단됨)
operator user-defined-string-literal < template-argument-list  (선택 사항) > (4) (C++11부터)
1) 단순 템플릿 식별자 .
2) 연산자 함수 템플릿 식별자.
3,4) literal operator 함수 템플릿 식별자.
template-name - 템플릿의 이름을 지정하는 식별자
op - 오버로드 가능한 연산자
identifier - 식별자
user-defined-string-literal - "" 뒤에 오는 식별자


클래스 템플릿 특수화를 명명하는 간단한 템플릿 식별자는 클래스를 명명합니다.

별칭 템플릿 특수화를 지칭하는 템플릿 식별자는 타입을 나타냅니다.

함수 템플릿 특수화를 지칭하는 템플릿 식별자는 함수를 지칭합니다.

다음 조건들이 모두 충족되면, 템플릿 식별자는 유효한(valid) 것으로 간주됩니다:

  • 매개변수만큼 많은 인수가 최대한 존재하거나 매개변수가 템플릿 parameter pack 인 경우 (C++11부터) .
  • 기본 템플릿 인수가 없는 비-추론 가능한 비-팩 (C++11부터) 매개변수 각각에 대해 인수가 존재합니다.
  • 각 템플릿 인수가 해당 템플릿 매개변수와 일치합니다.
  • 각 템플릿 인수를 이후 템플릿 매개변수(있는 경우)에 대입하는 것이 성공합니다.
(C++20부터)

유효하지 않은 단순 템플릿 ID는 컴파일 타임 오류입니다. 단, 함수 템플릿 특수화를 명시하는 경우는 예외이며 (이 경우 SFINAE 가 적용될 수 있습니다).

template<class T, T::type n = 0>
class X;
struct S
{
    using type = int;
};
using T1 = X<S, int, int>; // 오류: 인수가 너무 많음
using T2 = X<>;            // 오류: 첫 번째 템플릿 매개변수에 대한 기본 인수가 없음
using T3 = X<1>;           // 오류: 값 1이 타입 매개변수와 일치하지 않음
using T4 = X<int>;         // 오류: 두 번째 템플릿 매개변수에 대한 치환 실패
using T5 = X<S>;           // 정상

단순 템플릿 ID의 template-name 이 제약된 비함수 템플릿이나 제약된 템플릿 템플릿 매개변수를 지칭하지만, 알 수 없는 특수화의 멤버인 멤버 템플릿은 아닌 경우, 그리고 단순 템플릿 ID의 모든 템플릿 인자가 비의존적일 때, 제약된 템플릿의 연관 제약 조건들이 만족되어야 합니다:

template<typename T>
concept C1 = sizeof(T) != sizeof(int);
template<C1 T>
struct S1 {};
template<C1 T>
using Ptr = T*;
S1<int>* p;                      // error: constraints not satisfied
Ptr<int> p;                      // error: constraints not satisfied
template<typename T>
struct S2 { Ptr<int> x; };       // error, no diagnostic required
template<typename T>
struct S3 { Ptr<T> x; };         // OK, satisfaction is not required
S3<int> x;                       // error: constraints not satisfied
template<template<C1 T> class X>
struct S4
{
    X<int> x;                    // error, no diagnostic required
};
template<typename T>
concept C2 = sizeof(T) == 1;
template<C2 T> struct S {};
template struct S<char[2]>;      // error: constraints not satisfied
template<> struct S<char[2]> {}; // error: constraints not satisfied
(C++20부터)

다음 조건들이 모두 충족되면, 두 템플릿 식별자는 동일한(same) 것으로 간주됩니다:

  • 그들의 template-name  또는 연산자가 동일한 템플릿을 참조합니다.
  • 그들의 해당 타입 템플릿 인자가 동일한 타입입니다.
  • 그들의 해당 상수 템플릿 인자에 의해 결정된 템플릿 매개변수 값이 template-argument-equivalent 입니다.
  • 그들의 해당 템플릿 템플릿 인자가 동일한 템플릿을 참조합니다.

동일한 두 템플릿 식별자는 동일한 변수, (since C++14) 클래스, 또는 함수를 참조합니다.

템플릿 엔티티

템플릿화된 엔티티 (또는 일부 자료에서는 "템플로이드")는 템플릿 정의 내에서 정의된 (또는 람다 표현식 의 경우 생성된) (C++11부터) 모든 엔티티입니다. 다음은 모두 템플릿화된 엔티티에 해당합니다:

  • 클래스/함수 /변수 (C++14 이후) 템플릿
(C++20부터)
  • 템플릿화된 엔티티의 멤버 (예: 클래스 템플릿의 비템플릿 멤버 함수)
  • 템플릿화된 엔티티인 열거형의 열거자
  • 템플릿화된 엔티티 내에서 정의되거나 생성된 모든 엔티티: 로컬 클래스, 로컬 변수, 프렌드 함수 등
  • 템플릿된 엔티티의 선언에 나타나는 람다 표현식의 클로저 타입
(since C++11)

예를 들어,

template<typename T>
struct A
{
    void f() {}
};

함수 A::f 는 함수 템플릿이 아니지만, 여전히 템플릿화된 것으로 간주됩니다.


템플릿화된 함수 는 함수 템플릿 또는 템플릿화된 함수입니다.

템플릿화된 클래스 는 클래스 템플릿 또는 템플릿화된 클래스를 의미합니다.

템플릿 변수 는 변수 템플릿 또는 템플릿화된 변수입니다.

(C++14부터)

키워드

template , export

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
CWG 2293 C++98 템플릿 식별자의 유효성 판단 규칙이
제공되지 않았음
제공됨
CWG 2682 C++98
C++14
템플릿 함수/템플릿 클래스
(C++98)/템플릿 변수 (C++14)의 정의가 누락됨
추가됨
P2308R1 C++98 두 템플릿 식별자는 해당 상수 템플릿 인자가
template-argument-equivalent가 아닌 경우
서로 다른 것으로 간주됨
해당 상수 템플릿 매개변수 값이
template-argument-equivalent가 아닌 경우
서로 다른 것으로 간주됨

참고 항목

C documentation for Generic selection