C++

[C++] 클래스 템플릿의 부분 특수화(partial specialization)와 명시적 특수화(explict specialization)

코딩 메모장 2024. 11. 25. 21:40
728x90

C++ 템플릿의 부분 특수화명시적 특수화는 템플릿을 특정 타입이나 조건에 맞게 커스터마이징하는 강력한 기능입니다. 이를 통해 일반적인 템플릿을 특정 조건에 따라 다르게 동작하도록 설계할 수 있습니다.

 

1. 명시적 특수화 (Explicit Specialization)

명시적 특수화는 템플릿을 특정 타입에 대해 완전히 재정의하는 것입니다. 이는 특정 타입에 대해 일반 템플릿이 아닌 별도의 동작을 수행하도록 만듭니다.

기본 구조

template <typename T>
class MyClass {
    // 일반 템플릿 정의
};

// 특정 타입에 대한 명시적 특수화
template <>
class MyClass<특정타입> {
    // 특정 타입에 대한 특수화된 정의
};

예제: 명시적 특수화

#include <iostream>

// 일반 템플릿
template <typename T>
struct MyStruct {
    void show() {
        std::cout << "Generic template" << std::endl;
    }
};

// int 타입에 대한 명시적 특수화
template <>
struct MyStruct<int> {
    void show() {
        std::cout << "Specialized for int" << std::endl;
    }
};

int main() {
    MyStruct<double> obj1; // 일반 템플릿
    obj1.show();           // "Generic template" 출력

    MyStruct<int> obj2;    // 명시적 특수화
    obj2.show();           // "Specialized for int" 출력

    return 0;
}

장점

  • 특정 타입에 대해 완전히 다른 동작을 정의할 수 있습니다.
  • 구현이 간단하며 특정 타입에 대한 완전한 제어를 제공합니다.

제한

  • 오직 명시된 타입에 대해서만 동작하며, 나머지 타입은 일반 템플릿을 따릅니다.

2. 부분 특수화 (Partial Specialization)

부분 특수화는 템플릿의 일부 파라미터만 특정 조건으로 고정하고 나머지는 일반 템플릿으로 남겨두는 기법입니다. 이는 주로 템플릿 파라미터가 둘 이상인 경우에 사용됩니다.

기본 구조

template <typename T1, typename T2>
class MyClass {
    // 일반 템플릿 정의
};

// 첫 번째 타입을 특정 타입으로 고정한 부분 특수화
template <typename T2>
class MyClass<특정타입, T2> {
    // 부분 특수화된 정의
};

예제: 부분 특수화

#include <iostream>

// 일반 템플릿
template <typename T1, typename T2>
struct Pair {
    void show() {
        std::cout << "Generic Pair" << std::endl;
    }
};

// 첫 번째 타입이 int인 경우의 부분 특수화
template <typename T2>
struct Pair<int, T2> {
    void show() {
        std::cout << "Specialized Pair: First type is int" << std::endl;
    }
};

int main() {
    Pair<double, double> obj1; // 일반 템플릿
    obj1.show();               // "Generic Pair" 출력

    Pair<int, double> obj2;    // 첫 번째 타입이 int인 부분 특수화
    obj2.show();               // "Specialized Pair: First type is int" 출력

    return 0;
}

장점

  • 템플릿의 일부 조건에 따라 동작을 변경할 수 있어 유연성이 높습니다.
  • 여러 조건에 대해 다양한 특수화를 정의할 수 있습니다.

제한

  • 단일 템플릿 파라미터에는 적용할 수 없습니다.
  • 명시적 특수화보다 구현이 복잡할 수 있습니다.

3. 명시적 특수화와 부분 특수화 비교

특징 명시적 특수화 부분 특수화
정의 방식 특정 타입에 대해 템플릿을 완전히 재정의 일부 파라미터를 특정 조건으로 고정
적용 가능성 단일 또는 다중 템플릿 파라미터 모두 가능 템플릿 파라미터가 2개 이상일 때 유용
유연성 특정 타입에 대해 제한적 더 많은 조건에 대해 유연하게 대응 가능
구현 복잡성 상대적으로 간단 조건이 복잡할 경우 구현도 복잡

4. 활용 사례

  • 명시적 특수화는 특정 타입에 대한 최적화된 동작을 정의할 때 유용합니다.
    예: std::vector<bool>은 일반 템플릿이 아닌 특수화된 버전을 사용합니다.
  • 부분 특수화는 조건부로 동작을 변경하거나 특정 패턴을 처리할 때 활용됩니다.
    예: 스마트 포인터(std::shared_ptr, std::unique_ptr) 내부 구현에서 활용됩니다.\

결론

명시적 특수화부분 특수화는 C++의 템플릿을 더욱 강력하고 유연하게 만들어줍니다.

  • 명시적 특수화는 특정 타입에 대해 완전한 제어를 제공하며,
  • 부분 특수화는 복잡한 조건을 처리하거나 일부 파라미터만 고정해야 할 때 강력한 도구가 됩니다.

이 두 가지 기법은 코드 재사용성을 높이고, 타입에 따라 다른 동작을 구현하는 데 필수적인 역할을 합니다.

728x90

'C++' 카테고리의 다른 글

[C++] const static data member  (1) 2024.11.27
[C++] front 함수  (0) 2024.11.26
[C++] using키워드  (0) 2024.11.24
[C++] 클래스 템플릿(class template)  (0) 2024.11.21
[C++] decltype(타입 결정자)  (22) 2024.11.20