이번 편의 목표: 더 큰 값을 고르는 함수를 타입마다 다시 적지 않고 템플릿으로 만듭니다.
템플릿은 컴파일 때 타입이 채워지는 틀입니다. 호출하는 인자 타입이 정해지면 컴파일러가 그 타입용 함수를 만듭니다. int용과 double용은 서로 다른 함수입니다.
#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)처럼 양쪽을 같은 타입으로 만듭니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.