클래스 템플릿 특수화

반응형


클래스 템플릿을 특정 템플릿 인자로 특수화 할 수 있다.
이전글의 함수템플릿 오버로딩처럼 클래스 템플릿을 특수화 하려면
특정 데이터형에 맞게 구현해서 특정 데이터형에서 클래스 템플릿이
인스턴스화됐을때 잘못 동작할 수 있는 부분을 수정할 수 있다.
클래스 템플릿을 특수화 할려면 모든 멤버함수를 특수화해야한다.

stack1.hpp
template <typename T>
class Stack

위와 같이 만들었던 stack1을 특수화해서 stack2.hpp를 만들면 아래와 같다.

stack2.hpp
#include "stack1.hpp"

template<>
class Stack<std::string>

즉, 클래스 템플릿을 특수화할 경우에는 template<>을 먼저쓰고 클래스를 언언하고,
그 뒤에 어떤 데이터혀으로 클래스 템플릿을 특수화 할 것인지를 기술한다.

template<>
class Stack<std::string> {
private:
 std::deque<std::string> elems;  // elements

public:
 void push(std::string const&);  // push element
 void pop();                     // pop element
 std::string top() const;        // return top element
 bool empty() const {            // return whether the stack is empty
  return elems.empty();
 }
};

void Stack<std::string>::push (std::string const& elem)
{
 elems.push_back(elem);    // append copy of passed elem
}

void Stack<std::string>::pop ()
{
 if (elems.empty()) {
  throw std::out_of_range
   ("Stack<std::string>::pop(): empty stack");
 }
 elems.pop_back();         // remove last element
}

std::string Stack<std::string>::top () const
{
 if (elems.empty()) {
  throw std::out_of_range
   ("Stack<std::string>::top(): empty stack");
 }
 return elems.back();      // return copy of last element
}


외에도 부분특수화 라는것이 있다.
// 원본 클래스
template <typename T1, typename T2>
class MyClass{}

// 부분 특수화 1.
template <typename T>
class MyClass<T, T>

// 부분 특수화 2.
template <typename T>
class MyClass<T, int>

// 부분 특수화 3.
template <typename T1, typename T2>
class MyClass<T1*, T2*>

MyClass<int, float> temp;          // 원본 사용
MyClass<float, float> temp;       // 1 사용
MyClass<float, int> temp;          // 2 사용
MyClass<int*, float*> temp;       // 3 사용

'Study > Template' 카테고리의 다른 글

데이터형이 아닌 클래스 템플릿 파라미터  (2) 2010.06.25
기본 템플릿 인자  (0) 2010.06.25
클래스 템플릿  (0) 2010.06.18
오버로딩 (함수 템플릿)  (0) 2010.06.17
인자추론  (0) 2010.06.17
TAGS.

Comments