클래스 템플릿
#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 |