템플릿은 타입이나 값을 매개변수로 받는 틀이다. 컴파일러는 사용하는 인자 조합마다 구체 코드를 만든다. 이것을 인스턴스화라고 한다.

C++ 21. 템플릿으로 타입을 매개변수로의 핵심 흐름도
그림. 템플릿은 사용하는 타입마다 컴파일 시 구체 코드를 만든다.

함수 템플릿

template <typename T>
const T& larger(const T& a, const T& b) {
    return a < b ? b : a;
}

`larger(1, 2)`는 `T`가 `int`인 함수를 만든다. `larger(1, 2.0)`은 두 인자에서 `T`가 하나로 추론되지 않아 실패한다. 그때는 `larger<double>(1, 2.0)`처럼 명시한다.

의존 이름

템플릿 안에서는 어떤 이름이 타입인지 값인지 인자 `T`가 정해지기 전에 알기 어려울 수 있다. 의존적인 중첩 타입 앞에는 `typename`을 붙인다. 의존적인 베이스의 멤버를 그대로 쓰면 보이지 않을 수 있어 `this->`나 한정 이름이 필요하다.

클래스 템플릿도 같다. `std::vector<int>`와 `std::vector<double>`은 다른 타입이다. 코드가 늘어나는 대가로, 호출은 구체 타입에 대해 컴파일되므로 가상 함수 없는 다형성이 된다. 제약이 없으면 오류 메시지가 길다. 26편의 concepts가 그 제약을 선언으로 끌어올린다.