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