클래스 템플릿

클래스 템플릿 인스턴스화

클래스 템플릿은 타입을 인자로 받는 설계도라서 컴파일러가 사용 타입을 볼 수 있어야 하며, specialization과 deduction guide는 예외 경로를 만든다.

01

템플릿 정의

template <typename T> class Box처럼 타입 매개변수를 둔다.

blueprint
02

사용 타입 등장

Box<int>, Box<std::string>처럼 실제 타입이 쓰이는 지점을 컴파일러가 본다.

instantiation point
03

멤버 생성

해당 타입에 대해 필요한 멤버 함수 코드가 생성되고 타입 요구 조건을 검사한다.

compile-time
04

특수 규칙 적용

partial/full specialization이나 deduction guide가 있으면 일반 규칙보다 먼저 고려된다.

사용자 정의 경로
cpp 분리
정의가 .cpp에 있어 링크 실패 템플릿 정의는 인스턴스화 지점에서 보여야 하므로 헤더에 두거나 명시 인스턴스화한다.
undefined reference
type requirement
T가 필요한 연산을 지원하지 않음 operator<, copy, default constructor 요구를 concept/static_assert로 드러낸다.
constraint
specialization
특정 타입만 다른 동작 vector<bool>처럼 특수화는 직관을 깨뜨릴 수 있어 문서화가 필요하다.
예외 경로
CTAD
생성자 인자에서 타입 추론 의도와 다른 T가 추론되면 deduction guide로 보정한다.
C++17

타입 매개변수 설계

에러 메시지 제약이 깊은 구현부에서 터지지 않도록 public API 근처에 concept을 둔다.
코드 팽창 너무 많은 타입으로 인스턴스화하면 바이너리 크기가 커질 수 있다.
ABI 템플릿은 헤더 변경이 사용자 재컴파일로 이어질 수 있음을 고려한다.