다음을 통해 공유


클래스 템플릿의 명시적 특수화

클래스 템플릿은 템플릿 인수의 특정 형식 또는 값에 대해 특수화될 수 있습니다. 특수화를 사용하면 템플릿 코드를 특정 인수 형식 또는 값에 대해 사용자 지정할 수 있습니다. 특수화 없이 동일한 코드는 템플릿 인스턴스화에 사용될 각 형식에 대해 생성됩니다. 특수화에서 특정 형식이 사용될 때 원본 템플릿 정의 대신 특수화 정의가 사용됩니다. 특수화의 이름은 특수화에 대한 템플릿의 이름과 같습니다. 하지만 템플릿 특수화는 원본 템플릿과 여러 면에서 다를 수 있습니다. 예를 들어 다른 데이터 멤버와 멤버 함수를 포함할 수 있습니다.

특정 형식 또는 값에 대해 템플릿을 사용자 지정하려면 특수화를 사용합니다. 템플릿에 템플릿 인수가 두 개 이상 있고 그 중 하나만 특수화해야 할 경우 또는 모든 포인터 형식, 참조 형식 또는 배열 형식과 같은 모든 일련의 형식에 대한 동작을 특수화할 경우 부분 특수화를 사용합니다. 자세한 내용은 클래스 템플릿의 부분 특수화를 참조하십시오.

예제

// explicit_specialization1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

// Template class declaration and definition
template <class T> class Formatter
{
    T* m_t;
public:
    Formatter(T* t) : m_t(t) { }
    void print()
    {
        cout << *m_t << endl;
    }
};

// Specialization of template class for type char*
template<> class Formatter<char*>
{
    char** m_t;
public:
    Formatter(char** t) : m_t(t) { }
    void print()
    {
        cout << "Char value: " << **m_t << endl;
    }
};

int main()
{
    int i = 157;
    // Use the generic template with int as the argument.
    Formatter<int> formatter1(&i);

    char str[10] = "string1";
    char* str1 = str;
    // Use the specialized template.
    Formatter<char*> formatter2(&str1);

    formatter1.print(); // 157
    formatter2.print(); // Char value : s
}
  

참고 항목

참조

템플릿 클래스 인스턴스화

클래스 템플릿의 부분 특수화 (C++)