템플릿은 타입이나 값을 매개변수로 받는 틀이다. 컴파일러는 사용하는 인자 조합마다 구체 코드를 만든다. 이것을 인스턴스화라고 한다.
함수 템플릿
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가 그 제약을 선언으로 끌어올린다.
댓글
0개아직 댓글이 없습니다.