C++ 클래스 템플릿

클래스 템플릿 타입 구성

클래스 템플릿은 선언만으로 타입이 아니라 인자를 넣어야 실제 타입이 된다. 멤버 정의 위치, CTAD, partial specialization, non-type parameter까지 같이 보면 오류 원인을 빠르게 좁힐 수 있다.

01

매개변수 설계

데이터 타입, 크기, 비교 정책처럼 컴파일 타임에 달라질 요소를 고른다.

과한 일반화 경계
02

실제 타입 생성

Stack<int>와 Stack<double>은 서로 다른 타입으로 컴파일된다.

코드 bloat 고려
03

멤버 정의

템플릿 멤버 함수 정의는 보통 헤더에 있어야 인스턴스화 시 보인다.

링크 오류 방지
04

특수화

특정 타입이나 패턴에서 저장 방식·연산이 달라지면 specialization을 검토한다.

선택 규칙 점검
type param
typename T 컨테이너 항목 타입, 정책 객체, traits 타입처럼 타입 차이를 반영한다.
concept로 제한
non-type
값 매개변수 std::array<T, N>처럼 크기나 flag를 컴파일 타임 값으로 받는다.
상수 표현식
CTAD
생성자에서 타입 추론 C++17 이후 생성 인자로 클래스 템플릿 인자를 추론할 수 있다.
guide 필요 가능
traits
타입별 성질 제공 템플릿 본문이 타입 특성에 따라 분기하도록 별도 구조를 둔다.
분기 격리

헤더 정의 · 인스턴스 수 · 특수화 점검

헤더 정의 템플릿 선언만 cpp에 두고 정의를 숨겨 링크 오류가 나지 않는지 확인한다.
인스턴스 수 너무 많은 타입 조합이 바이너리 크기와 컴파일 시간을 키우지 않는지 본다.
특수화 partial specialization이 primary template의 불변식과 같은 계약을 지키는지 확인한다.