
클래스에 대한 템플릿인 클래스 템플릿도 존재하는데, 형태는 위와 같고 타입에 따라 달라지는 부분만 T를 사용한다.
클래스 템플릿에 의해 클래스가 만들어질때마다 클래스 크기만큼의 용량이 역시 증가한다.
template <typename T>
class PosValue
{
private:
int x,y;
T value;
public:
PosValue(int ax, int ay, T av) : x(ax),y(ay),value(av) { }
void OutValue();
};
클래스 템플릿의 생성자에는 <T>를 사용하지 않는다.
template <typename T>
void PosValue<T>::OutValue()
{
gotoxy(x,y);
cout << value << endl;
}
클래스 템플릿은 멤버함수를 외부에서 작성할 때는 클래스이름에<T>를 붙인다. 그리고 T가 템플릿 인수임을 명시하기 위해 template <typename T>가 먼저 와야한다.
template <typename T, int N>
class Array
{
private:
T ar[N];
public:
void SetAt(int n,T v) { if (n < N && n >=0) ar[n]=v; }
T GetAt(int n) { return (n < N && n >=0 ? ar[n]:0); }
};
템플릿의 인수로 타입이 아닌 상수를 전달할 수 있다. 이것을 비타입 인수라고 한다. 비타입 인수를 통해 위 코드처럼 배열의 크기를 임의로 정할 수 있다.
template <typename T=int>
class PosValue
{
....
PosValue<> iv(1,1,2);
클래스 템플릿에 한해서 템플릿 인수를 디폴트로 지정할 수 있다. 클래스 템플릿에만 적용되는 이유는 클래스는 객체를 선언할때 클래스타입을 지정하지만 함수는 호출할 때 실인수의 타입을 보고 구체화할 함수를 결정하기 때문에 실인수를 생략하는 것이 불가능하다.
template<> class 클래스명<특수타입>
클래스 템플릿도 위와 같이 함수 템플릿처럼 특수화를 할 수 있다. 특수화한 클래스 템플릿의 멤버함수는 이미 타입이 정해졌으므로 외부에서 작성할 때 template<typenameT>를 작성할 필요가 없다.
template <typename T1, typename T2> class SomeClass { ... }
template <typename T1> class SomeClass<T1, 특수 타입> { ... }
템플릿 인수가 2개 이상일 때 둘 중 하나의 인수만 정해서 특수화할 수도 있다. 이것을 부분 특수화라고 하며, 인수 하나에 대해서 타입을 강제로 지정할 수 있다.
'C++' 카테고리의 다른 글
| [C++] 예외 객체 (0) | 2022.01.07 |
|---|---|
| [C++] 예외 처리 (0) | 2022.01.07 |
| [C++] 함수 템플릿 (0) | 2022.01.06 |
| [C++] 순수 가상 함수 (0) | 2022.01.06 |
| [C++] 가상 함수, 가상 파괴자 (0) | 2022.01.05 |