C++ 템플릿 특수화

특수화: 타입 패턴별 구현 선택 규칙

템플릿 특수화는 예외 처리를 붙이는 기능이 아니라 컴파일러가 더 구체적인 타입 패턴을 만났을 때 다른 구현을 고르게 하는 규칙이다. full, partial, overload, if constexpr의 역할을 분리한다.

01

기본 계약

primary template이 모든 타입에서 지킬 의미와 인터페이스를 먼저 정의한다.

템플릿 특수화 공통 계약
02

패턴 추가

포인터, 배열, 특정 타입처럼 구현이 달라지는 패턴만 특수화한다.

필요한 만큼
03

후보 비교

여러 partial specialization이 맞으면 어느 쪽이 더 특수한지 비교된다.

모호하면 오류
04

대안 판단

작은 분기는 if constexpr, 함수 선택은 overload나 concept이 더 명확할 수 있다.

도구 선택
Full
template<> X<int> 정확히 int 조합에서만 별도 구현이 선택된다.
가장 구체적
Partial
X<T*> 같은 패턴 포인터 전반처럼 일부 구조가 같은 타입군을 잡는다.
클래스 템플릿 중심
Function
함수 템플릿은 overload 우선 고려 함수 템플릿 partial specialization은 없으므로 overload나 helper class를 쓴다.
혼동 잦음
if constexpr
하나의 본문 안 컴파일 분기 조건별 차이가 작으면 특수화 파일을 흩뜨리지 않는다.
C++17

계약 유지 · 모호성 · 오류 메시지 점검

계약 유지 특수화가 primary와 같은 public API와 의미를 유지하는지 확인한다.
모호성 새 partial specialization 추가 후 기존 타입 조합이 ambiguous가 되지 않는지 테스트한다.
오류 메시지 제약 없는 특수화보다 concept으로 실패 조건을 드러내는 편이 나은지 본다.