블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (666)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (105)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (217)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total343,756
Today5
Yesterday73


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

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.24
클래스 템플릿  (0) 2010.06.18
오버로딩 (함수 템플릿)  (0) 2010.06.17
인자추론  (0) 2010.06.17
Posted by 붕대마음

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함