클래스 템플릿을 특수화 하는 이유는 특정 자료형을 기반으로 생성된 객체에 대해, 구분이 되는 다른 행동양식을 적용하기 위해서이다. 즉, 클래스 템플릿을 특수화하면, 템플릿을 구성하는 멤버함수의 일부 또는 전부를 다르게 행동하도록 정의할 수 있다. 클래스 템플릿을 특수화하는 방법은 다음과 같다. 먼저 다음과 같이 정의된 클래스 템플릿이 존재 할때,
template <typename T>
class SoSimple
{
public:
T SimpleFunc(T num) { . . . . }
}
이를 기반으로 자료형 int에 대해 특수화 한 템플릿 클래스는 다음과 같이 정의한다.
template <>
class SoSimple<int>
{
public:
int SimpleFunc(int num) { . . . . }
}
이렇게 in형에 대해서 특수화가 되고 나면, 다음 형태로 객체 생성시,
SoSimple<int> obj;
특수화된 템플릿 클래스 SoSimple<int> 를 대상으로 객체가 생성된다
그럼 예제를 통해서 클래스 템플릿의 특수화를 진행 해보겠다.
#include <iostream>
#include <string>
template <typename T>
class Point
{
private:
T xpos, ypos;
public:
Point(T x = 0, T y = 0) : xpos(x), ypos(y)
{ }
void ShowPosition() const
{
std::cout << '[' << xpos << ", " << ypos << ']' << std::endl;
}
};
template <typename T>
class SimpleDataWrapper
{
private:
T mdata;
public:
SimpleDataWrapper(T data) : mdata(data)
{ }
void ShowDataInfo(void)
{
std::cout << "Data : " << mdata << std::endl;
}
};
template <>
class SimpleDataWrapper <char*>
{
private:
char* mdata;
public:
SimpleDataWrapper(const char* data)
{
int len = strlen(data) + 1;
mdata = new char[len];
strcpy_s(mdata, len, data);
}
void ShowDataInfo()
{
std::cout << "String : " << mdata << std::endl;
std::cout << "Lenght : " << strlen(mdata) << std::endl;
}
~SimpleDataWrapper() { delete[]mdata; }
};
template <>
class SimpleDataWrapper <Point<int>>
{
private:
Point<int> mdata;
public:
SimpleDataWrapper(int x, int y) : mdata(x, y)
{ }
void ShowDataInfo(void)
{
mdata.ShowPosition();
}
};
int main(void)
{
SimpleDataWrapper<int> iwrap(170);
SimpleDataWrapper<char*> swrap("Class Tmeplate Specialization");
SimpleDataWrapper<Point<int>> poswarp(3, 7);
iwrap.ShowDataInfo();
swrap.ShowDataInfo();
poswarp.ShowDataInfo();
return 0;
}
위 예제에서는 char* 형과 템플릿 클래스의 자료형인 Point<int> 형 대상의 특수화를 보이고 있다
'프로그래밍 > C++' 카테고리의 다른 글
dynamic_cast (0) | 2023.02.14 |
---|---|
C++ 의 예외처리 메커니즘 (0) | 2023.02.10 |
C++ 배열 기반의 문자열 입 출력 (0) | 2021.11.09 |
C++ 입력받기 (0) | 2021.11.09 |
C++ 출력 (0) | 2021.11.09 |
댓글