클래스 템플릿 요구 조건

클래스 템플릿 요구 조건

Container<T>는 어떤 T든 받을 수 있어 보이지만 실제로는 복사, 이동, 비교, 기본 생성 같은 요구 조건이 숨어 있다. 그 요구를 선언부 가까이에 드러내야 한다.

01

T의 능력을 적는다

멤버 함수에서 T()나 operator<를 쓰면 그 요구를 concept이나 문서로 표시한다.

02

인스턴스 경계를 이해한다

Buffer<int>와 Buffer<string>은 서로 다른 타입이고 코드 생성도 별도로 일어날 수 있다.

03

긴 타입을 숨긴다

정책 인자가 늘어나면 using alias로 호출부의 의도를 살린다.

header
정의 가시성 템플릿 멤버 정의가 사용 번역 단위에서 보여야 인스턴스화된다.
cpp 분리는 명시 인스턴스화가 필요하다.
concept
요구 조건 T가 만족해야 하는 연산을 선언부에서 제한한다.
오류 메시지가 좋아진다.
policy
행동 주입 비교자, 할당자, 저장 전략을 타입 인자로 받을 수 있다.
기본값을 잘 고른다.
bloat
타입별 코드 증가 많은 T 조합이 코드 크기를 늘릴 수 있다.
핫 경로에서 측정한다.

T 요구 · 정의 위치 · 타입 이름 점검

T 요구 복사 불가 타입을 넣었을 때 어떤 멤버가 실패하는지 명확한가.
정의 위치 링크 오류 없이 템플릿 멤버 본문이 보이는가.
타입 이름 호출부가 너무 긴 템플릿 조합을 직접 읽고 있지 않은가.

요구 조건 표시

template <typename T>
requires std::movable<T>
class Queue {
    std::vector<T> items_;
        overflow-wrap: break-word;
        word-break: keep-all;
      };