함수 템플릿

함수 템플릿 오버로드

함수 템플릿은 단순 복붙 함수가 아니라 인자 타입 추론, overload resolution, specialization, SFINAE/concepts 조건을 거쳐 최종 호출 대상이 결정된다.

01

후보 수집

같은 이름의 일반 함수와 함수 템플릿 인스턴스 후보를 모은다.

candidate set
02

타입 추론

인자 타입을 보고 T, U 같은 템플릿 매개변수를 결정한다.

deduction
03

제약 검사

requires, enable_if, concept 조건을 만족하지 않으면 후보에서 제외된다.

SFINAE/constraints
04

최선 후보 선택

변환 비용과 특수성 기준으로 overload resolution이 최종 함수를 고른다.

best viable
return only T
반환 타입만으로 T 추론 불가 인자에 T가 없으면 호출자가 명시 타입을 주거나 별도 인자를 둬야 한다.
no deduction from return
const/ref
참조와 const 보존 여부 T, T&, const T&의 추론 차이가 복사와 수정 가능성을 바꾼다.
value category
overload surprise
일반 함수가 더 좋은 후보 정확히 맞는 비템플릿 함수가 템플릿보다 선택될 수 있다.
priority
constraint missing
템플릿 내부에서 긴 오류 비교 가능, 산술 타입 등 요구 조건을 concept으로 API에 드러낸다.
diagnostics

리뷰 기준

명시 호출 foo<int>(x)가 필요한 경우 추론 설계가 너무 불편한지 본다.
불필요 일반화 두 타입만 쓸 함수라면 템플릿보다 오버로드가 더 읽기 쉬울 수 있다.
제약 사용 가능한 타입 범위를 concept으로 문서화하면 오류 품질이 올라간다.