Mental Model

정의는 하나, 판단은 호출마다, 코드는 타입마다 생긴다

T 추론, 명시적 타입 지정, 오버로드 우선순위는 따로 외우기보다 “호출문이 어떤 함수를 만들고 고르는가”로 함께 읽으면 됩니다.

정의

타입 자리표시자

template <typename T>
T clamp(T,T,T);
호출

T 결정

clamp(7, 0, 10)
// T = int
생성

실제 함수

int clamp(int v,
          int lo,
          int hi);
// 결과 7
모호함

타입이 섞이면 직접 고정

max(10, 3.14)        // 오류
max<double>(10, 3.14) // OK

하나의 T가 두 타입을 동시에 뜻할 수 없기 때문입니다.

제약

본문 요구를 선언부에 올리기

template <typename T>
requires std::totally_ordered<T>
const T& max_ref(const T& a,
                 const T& b);

비교 가능한 타입만 후보가 되어 오류 메시지가 짧고 정확해집니다.

타입 고정 max<double>(10, 3.14) 인자가 섞이면 T를 명시해 후보를 좁힌다.
본문 제약 requires ordered<T> 필요 연산을 선언부에 올려 오류를 짧게 만든다.
최종 점검

호출문 옆에 세 줄만 붙여 읽기