Programming/C C++
함수 템플릿처럼 전체적인 구조는 갖지만 데이터형에 따라 다른 취급을 하는 각각의 클래스를 생성할 수 있습니다.
template <typename T>
class Base
{
public:
   void set_value(T i);
   T get_value();

private:
   T j;
};
클래스에 템플릿을 적용하려면 클래스 머리위에 template 키워드를 사용해야 합니다. 또한 <>안에 typename을 지정하여 뒤의 식별자가 데이터형임을 나타내도록 합니다.

식별자 T는 클래스 본문에서 필요한 멤버에 붙여 사용합니다. 현재 Base클래스는 T형 변수 j와 이 변수에 값을 저장하기 위한 set_value()함수 그리고 저장된 값을 불러오는 get_value()함수가 선언되어 있습니다.
template <typename T>
void Base<T>::set_value(T i)
{
   j = i;
}

template <typename T>
T Base<T>::get_value()
{
   return j;
}
클래스 멤버함수를 정의하는 부분에서도 typename 식별자가 필요한 경우 똑같이 템플릿을 적용해야 하며 특히 클래스명과 연결할때는 Base<T>처럼 데이터형을 의미하는 식별자까지 완벽하게 붙여야 하니다.
Base<int> b;
b.set_value(100);
cout << b.get_value() << endl;

Base<char> b2;
b2.set_value(65);
cout << b2.get_value() << endl;
템플릿이 적용된 클래스의 객체를 생성하는 경우 또한 클래스명에 <데이터형>을 붙여 어떤 데이터형의 값을 전달할 것이지 명확하게 지정해야 합니다.


클래스 템플릿은 필요한 경우 특정 데이터형의 값을 추가적으로 전달할 수도 있습니다.
template <typename T, int x = 10>
class Base
{
public:
   void set_value(int idx, T i);
   T get_value(int idx);

private:
   T j[x];
};
클래스 템플릿에 x 값을 추가하였는데 이 x는 int형으로서 10으로 초기화 됩니다. 그러나 클래스 내부에서는 x자체가 사용되는 것이 아니고 x에 대입된 10으로 값이 치환(j[x] == x[10]) 되어집니다.

위 예제에서는 x에 지정된 값만큼의 j배열이 생성될 것입니다.
template <typename T, int x>
void Base<T, x>::set_value(int idx, T i)
{
   j[idx] = i;
}

template <typename T, int x>
T Base<T, x>::get_value(int idx)
{
   return j[idx];
}
물론 멤버함수를 정의하는 경우에도 클래스의 템플릿과 일치시켜야 합니다. 다만 클래스에서처럼 값을 정해두지는 않습니다.

위 멤버함수는 인덱스를 지정하여 j배열에 있는 인덱스에 값을 설정하거나 가져올 수 있도록 하였습니다.

'Programming > C C++' 카테고리의 다른 글

[Visual C++] 전처리문(Preprocessor)  (0) 2012.10.24
[Visual C++] 추상클래스  (0) 2012.10.19
[Visual C++] 클래스 템플릿  (0) 2012.10.18
[Visual C++] 업/다운 캐스팅  (0) 2012.10.17
[Visual C++] 프렌드 클래스  (0) 2012.10.16
[Visual C++] 배열  (3) 2012.10.10
0 0