클래스 템플릿

반응형


#include <vector>
#include <stdexcept>

template <typename T>                            // 데이터형 파라미터로 사용할 식별자
class Stack 
                   
{
public:
 void push(T const&);
 void pop();
 T top() const;
 bool empty() const
 {
  return data_.empty();
 }
private:
 std::vector<T> data_;
};

클래스 템플릿 내부에서 다른 일반적인 데이터형처럼 T를 사용하여 멤버와 멤버함수를 선언할 수 있다.
이 클래스의 데이터형은 Stack<>이고 T는 템플릿 파라미터이다.
그러므로 선언에서 이 클래스의 데이터형을 써야 한다면 Stack<T>로 표기해야 한다.
ex ) 복사생성자나 할당연산자.
Stack (Stack<T> const&);                                 복사생성자
Stack<T>& operator= (Stack<T> const&);           할당연산자

하지만 데이터형이 아닌 이름이 필요하다면 Stack만을 사용해야 한다.
ex ) 생성자, 소멸자를 명시할 때
Stack (Stack<T> const&);                                 복사생성자
~Stack();                                                         소멸자

멤버함수를 정의할 때에는 이것이 함수템플릿이라는 것을 명시하기 위해 템플릿의 전체 데이터형 한정자를 사용한다.
template <typename T>
void Stack<T>
::push(T const& data)
{
 data_.push_back(data);
}

template <typename T>
void Stack<T>::pop()
{
 if(empty())
  throw std::out_of_range("stack empty");

 data_.pop_back();
}

template <typename T>
T Stack<T>::top() const
{
 if(empty())
  throw std::out_of_range("stack empty");

 return data_.back();
}


사용법
#include "stdafx.h"

#include <iostream>
#include <string>
#include <cstdlib>

#include "stack1.hpp"

int _tmain(int argc, _TCHAR* argv[])
{
 Stack<int> intStack;               // 클래스 템플릿 객체를 사용하기 위해서는 템플릿 인자를 반드시 명시해야 한다.
 intStack.push(1);
 intStack.push(2);
 intStack.pop();
 intStack.empty();
 intStack.pop();
 intStack.top();
 intStack.empty();
 return 0;
}

 

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

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

Comments