클래스 템플릿도 특수화가 가능하며, 특수화를 위해서는 특수화 대상이 되는 템플릿 클래스가 필요하다. 아래는 대상이 되는 템플릿 클래스와 이를 특정 타입(double)에 대해 특수화 시킨 예이다.
template class BASE { public: T func() {}; }; template<> class BASE { public: int FuNc(float v) {}; };
주지할 점은 기본 대상이 되는 클래스 템플릿인 BASE와 double 타입에 대해 특수화된 클래스 템플릿 BASE는 완전히 별개의 클래스라는 점으로, 위처럼 서로 가지고 있는 맴버에 공통점이 없다.
템플릿 클래스 자체를 특수화하는 경우 뿐만 아니라, 가지고 있는 맴버 함수만을 콕… 지정해서 특수화 하는 것도 가능하다. 아래는 그 예이다.
template class BASE { public: T func() {}; }; template<> int BASE::func() { // another implementation for int type }
위의 예는 BASE 함수의 func 함수에 대해 T가 int일때에 대한 특수화의 예이다.
템플릿 인자열 변형을 통한 특수화, 즉 클래스 템플릿 부분 특수화의 예
template class CLASS_NAME {}; // template class CLASS_NAME<T*, T, i> {}; // template class CLASS_NAME<char, T, 5> {}; // template class CLASS_NAME<T*, T, 0> {}; //
이 특수화 대상이 되는 원래 클래스 템플릿이며, , , 가 클래스 템플릿 부분 특수화의 경우이다.
클래스 템플릿이 사용되는 경우는 아래와 같다.
CLASS_NAME<int, double, 10> a;
, , 에 대한 실제 사용 예는 아래와 같으며 순서대로 각 , , 에 일치한다.
CLASS_NAME<int*, int, 20> b; CLASS_NAME<char, float, 5> c; CLASS_NAME<char*, char, 3> d;
주목할 점은 클래스 템플릿 부분 특화의 경우 특수화 대상이 되는 원래 클래스 템플릿과 템플릿 인자의 개수가 정확히 일치해야한다. 위의 경우 3개로써 <type, type, int value>이다. 또한 , , , 의 템플릿 클래스는 서로 완전이 다른 클래스 라는 점이며, 단지 템플릿을 통한 관계를 유일한 공통점으로 가지고 있다.
정리지만 많은 도움이 되었습니다. 감사합니다~
네~ ^^