partial_specialization — 부분 템플릿 특수화

partial_specialization — 부분 템플릿 특수화 (Partial template specialization)

**부분 템플릿 특수화(partial template specialization)**는 클래스 템플릿과 변수 템플릿을 주어진 템플릿 인자 범주(category)에 맞게 커스터마이즈할 수 있게 해주는 기능이에요.

기본 템플릿(primary template)과 달리, 템플릿 인자의 일부만 특정 패턴에 맞출 때 사용해요.

출처: cppreference

본문

문법 (Syntax)

template< parameter-list > class-key class-head-name < argument-list > declaration           // (1)
template< parameter-list > decl-specifier-seq declarator < argument-list > initializer        // (2)

여기서 class-head-name은 이전에 선언된 클래스 템플릿의 이름을, declarator는 이전에 선언된 변수 템플릿의 이름을 나타내요.

부분 특수화는 주 템플릿이 정의될 수 있는 어느 범위에서든 선언될 수 있어요.

// 기본 템플릿
template<typename T>
struct MyContainer { /* 일반 구현 */ };

// T가 포인터일 때의 부분 특수화
template<typename T>
struct MyContainer<T*> {
    // 포인터에 특화된 더 가벼운 구현
};

부분 특수화는 <> 사이에 부분적으로 특정된 패턴을 써요.

template<typename T, typename U>
struct Pair { /* 두 타입 */ };

// 두 타입이 같을 때의 부분 특수화
template<typename T>
struct Pair<T, T> {
    // T, T 케이스에 대한 최적화
};

특징들:

  • 부분 특수화는 모든 템플릿 매개변수를 특정하지 않고 일부만 특정해요.
  • 주 템플릿보다 더 구체적(specialized)일수록 우선 선택돼요.
  • 함수 템플릿은 부분 특수화할 수 없어요. 대신 오버로딩을 써야 해요. (클래스 템플릿과 변수 템플릿만 가능)
  • 완전 특수화(explicit/full specialization)는 template<>로 템플릿 인자를 전부 특정해요.
// 완전 특수화 (정수형)
template<>
struct MyContainer<int> { /* int 전용 */ };

부분 특수화는 일반적인 구현과 특별한 구현을 공존시키면서, 타입의 성질(포인터, const, 참조, 주어진 조건 등)에 따라 동작을 바꾸고 싶을 때 유용해요. 템플릿 메타프로그래밍의 강력한 도구예요.

더 알아보기 (Learn more)

cppreference