Specialization

템플릿 특수화

특수화는 특정 타입에서 다른 구현을 쓰게 해 준다. 하지만 primary template과 의미가 어긋나면 호출자는 타입에 따라 전혀 다른 계약을 만나게 된다.

01

기본 계약 작성

모든 타입에 공통으로 기대하는 의미와 반환 규칙을 primary template에 둔다.

02

예외 타입을 좁힌다

정말 다른 알고리즘이 필요한 타입 조합만 full 또는 partial specialization으로 뺀다.

03

호출자 의미를 맞춘다

특수화가 더 빠를 수는 있어도 결과 의미와 예외 정책은 기본 규칙과 맞아야 한다.

full specialization
정확한 타입 대체 T=int처럼 모든 템플릿 인자가 확정된 경우 별도 정의를 제공한다.
선언 순서와 가시성에 주의한다.
partial specialization
패턴 대체 포인터 타입, 배열 크기, 특정 템플릿 조합 같은 패턴을 잡는다.
함수 템플릿에는 부분 특수화가 없다.
if constexpr
본문 안 분기 작은 차이는 특수화보다 한 템플릿 안에서 조건 분기하는 편이 읽기 쉽다.
조건이 컴파일 시간에 결정된다.
concept overload
후보 제한 타입 조건별 함수 오버로드로 더 자연스럽게 표현할 수 있다.
오류 메시지도 좋아진다.

의미 보존 · 가시성 · 대안 선택 점검

의미 보존 특수화가 primary template과 같은 계약을 지키는가.
가시성 특수화 선언이 사용 지점보다 늦어 의도치 않은 기본 인스턴스가 생기지 않는가.
대안 선택 특수화보다 if constexpr이나 오버로드가 더 국소적인 변경인가.

타입 특성 특수화

template <typename T> struct IsByteBuffer : std::false_type {};
template <> struct IsByteBuffer<std::vector<std::byte>> : std::true_type {};

static_assert(IsByteBuffer<std::vector<std::byte>>::value);