이번 편의 목표: 더 큰 값을 고르는 함수를 타입마다 다시 적지 않고 템플릿으로 만듭니다.

템플릿은 컴파일 때 타입이 채워지는 틀입니다. 호출하는 인자 타입이 정해지면 컴파일러가 그 타입용 함수를 만듭니다. int용과 double용은 서로 다른 함수입니다.

C++
#include <iostream>
#include <string>

template <typename T>
T larger(T left, T right) {
    return (left > right) ? left : right;
}

int main() {
    std::cout << larger(12000, 1800) << '\n';
    std::cout << larger(2.5, 3.5) << '\n';
    std::cout << larger(std::string("공책"), std::string("개미")) << '\n';
    return 0;
}

12000이 1800보다 큽니다. 3.5가 2.5보다 큽니다. std::string의 >는 사전 순입니다. UTF-8 바이트 순서로 비교하므로, 화면에 보이는 가나다순과 항상 같다고 가정하지 않습니다. 이 호출은 템플릿이 문자열에도 적용되는지만 확인합니다.

두 인자의 타입이 다르면 하나의 T로 맞출 수 없어 컴파일에 실패합니다. larger(1, 2.5)가 그 경우입니다. 템플릿 본문은 호출하는 파일이 볼 수 있어야 하므로, 작은 템플릿은 헤더에 둡니다. 14편의 일반 함수처럼 소스 파일에만 본문을 숨기면, 다른 파일의 호출 지점에서 틀을 만들 수 없습니다.

직접 해 보기

larger에 가격 9000과 18000을 넘겨 18000이 출력되는지 확인하세요. 이어서 int와 double을 한 호출에 섞어 컴파일 오류가 나는지 보세요.

해설

같은 int 두 개면 더 큰 18000이 반환됩니다. 1과 2.5처럼 타입이 다르면 T를 하나로 정하지 못해 컴파일이 멈춥니다. 실수로 맞추려면 larger(1.0, 2.5)처럼 양쪽을 같은 타입으로 만듭니다.