C++ 템플릿 선택

특수화와 오버로드의 선택 규칙을 분리해 읽기

템플릿 특수화는 코드를 더 많이 쓰는 문법이 아니라 컴파일러가 어떤 구현을 고를지 정하는 규칙이다. primary, partial, full specialization과 overload를 같은 표에서 비교한다.

01

후보 생성

호출이나 타입 사용에서 적용 가능한 primary template과 특수화 후보를 모은다.

먼저 후보 집합
02

패턴 매칭

포인터, 참조, const, 배열, 특정 타입처럼 더 구체적인 패턴이 있는지 확인한다.

구체성 비교
03

부분 순서

partial specialization끼리는 어느 쪽이 더 특수한지 컴파일러가 비교한다.

모호하면 오류
04

대안 선택

단순 분기는 if constexpr나 concept overload가 더 읽기 쉬울 수 있다.

과한 특수화 경계
Full
완전히 지정된 타입 template<> struct X<int>처럼 특정 조합에만 적용된다.
가장 직접적
Partial
일부 패턴만 고정 X<T*>처럼 포인터 전반에 대한 규칙을 따로 둘 수 있다.
함수 템플릿은 제한적
Overload
함수 호출 후보 경쟁 특수화보다 overload나 concept로 의도를 드러내는 편이 안전한 경우가 있다.
ADL도 고려
if constexpr
하나의 구현 안에서 컴파일 분기 타입 조건별 차이가 작으면 분산된 특수화보다 추적이 쉽다.
C++17 이후

모호성 · 유지보수 · 제약 점검

모호성 두 partial specialization이 모두 더 특수하다고 볼 수 없으면 컴파일 오류가 난다.
유지보수 새 타입을 추가할 때 primary와 specialization의 불변식이 동시에 맞는지 확인한다.
제약 concept이나 enable_if를 쓰면 실패 메시지와 후보 제거 시점까지 확인한다.