Class Template

클래스 템플릿 인스턴스

Stack<int>와 Stack<string>은 같은 틀에서 나왔지만 다른 타입이다. 멤버 정의 위치, 타입 별칭, 정책 인자를 함께 설계해야 재사용이 안정된다.

01

변하는 축 선택

값 타입만 바뀌는지, 비교 방식이나 저장 정책도 바뀌는지 분리한다.

02

정의를 노출한다

템플릿 멤버 함수 정의는 인스턴스화 시점에 보여야 하므로 보통 헤더에 둔다.

03

사용 이름 축소

복잡한 템플릿 조합은 using alias로 도메인 이름을 붙여 호출부를 정리한다.

T
저장 값 타입 컨테이너 내부 원소, 반환 타입, constness 정책에 영향을 준다.
T 요구 조건을 문서화한다.
멤버 정의
링크 오류 예방 cpp 파일에만 정의하면 다른 번역 단위에서 인스턴스화할 때 본문을 못 볼 수 있다.
명시 인스턴스화는 예외적 선택이다.
비타입 인자
크기와 정책 std::array<T, N>처럼 값이 타입의 일부가 된다.
N이 다르면 서로 다른 타입이다.
정책 인자
전략 분리 비교자, 해시, 할당자처럼 행동을 타입으로 주입할 수 있다.
기본값을 신중히 둔다.

요구 조건 · 정의 위치 · 타입 폭발 점검

요구 조건 T가 복사 가능해야 하는지, 이동만 가능해도 되는지 명확한가.
정의 위치 템플릿 멤버 함수 본문이 사용 번역 단위에서 보이는가.
타입 폭발 정책 인자를 너무 많이 열어 호출부 타입이 읽기 어려워지지 않는가.

작은 클래스 템플릿

template <typename T, std::size_t N>
class RingBuffer {
public:
    bool push(T value);
private:
    std::array<T, N> data_{};
};