본문 바로가기

C++

[C++] 클래스 템플릿

클래스에 대한 템플릿인 클래스 템플릿도 존재하는데, 형태는 위와 같고 타입에 따라 달라지는 부분만 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