본문 바로가기
프로그래밍/C++

클래스 템플릿의 특수화

by 코끼리_땃쥐 2023. 2. 9.

클래스 템플릿을 특수화 하는 이유는 특정 자료형을 기반으로 생성된 객체에 대해, 구분이 되는 다른 행동양식을 적용하기 위해서이다. 즉, 클래스 템플릿을 특수화하면, 템플릿을 구성하는 멤버함수의 일부 또는 전부를 다르게 행동하도록 정의할 수 있다. 클래스 템플릿을 특수화하는 방법은 다음과 같다. 먼저 다음과 같이 정의된 클래스 템플릿이 존재 할때,

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

댓글