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

템플릿(template)

by 리뷰하는 (게임)프로그래머_리프TV 2010. 4. 4.




변수 형에 대해서 오버로딩을 해서 여러가지 기능을 수행하는 함수를 중복정의를 할 수 있다.

하지만 그것 보다 더 좋은것이 존재 하니,

그것은 템플릿,

개념 자체는 어렵지 않다.

예제를 보자.

#include <iostream>

// 최소 클래스 템플릿 선언
template <typename T1, typename T2>
class Data
{
	T2 name;
	T1 rank;
public:
	Data( T1 a, T2 b );
	~Data();
};

// 외부에서 선언 하는 방법
template <typename T1, typename T2>
Data<T1, T2>::Data( T1 a, T2 b )
{
	name = new char[strlen(b)+1];
	strcpy( name, b );
	rank = a;
}

// 소멸자.
template <typename T1, typename T2>
Data<T1, T2>::~Data()
{
	std::cout << name << std::endl;
	std::cout << rank << std::endl;
	delete [] name;
}

void main()
{
	// Data클래스 선언시 어떤 타입의 변수로 선택할 것인지 정해야 한다.
	Data<int, char*> d1( 1, "소갈비" );
	Data<int, char*> d2( 2, "닭갈비" );
	Data<int, char*> d3( 3, "이동갈비" );
	Data<int, char*> d4( 4, "통갈비" );
	Data<int, char*> d5( 5, "LA갈비" );
	Data<int, char*> d6( 6, "돼지갈비" );
}​


이 처럼, 실행이 되면 T1은 int로 T2는 char*로 파악하여 생성자나, 함수들을 실행한다.
그리고 템플릿 특수화 라는 것이 존재하는데,
템플릿을 통해 타입을 정할 때 특정 타입에 대해서만 다시 재정의 하는 것이 가능하다.

#include <iostream>

// 일반적으로 템플릿을 사용하면 이쪽으로 오지만.
template < typename T >
class AAA
{
public:
	void ShowType()
	{
		std::cout << "일반 템플릿" << std::endl;
	}
};

// double 타입에 대해서 특수화를 시켜 준 것이다.
template <> class AAA < double >
{
public:
	void ShowType()
	{
		std::cout << "double에 대한 템플릿 특수화" << std::endl;
	}
};

void main()
{
	AAA<int> iA;
	iA.ShowType();
	AAA<char> iC;
	iC.ShowType();
	AAA<float> iF;
	iF.ShowType();
	// 다른 부분은 모두 템플릿 클래스 안에 ShowType을 출력하지만.
	// double만 다른 곳에서 호출 되는 것이 확인 가능하다.
	AAA<double> iD;
	iD.ShowType();
}
// 결과
// 일반 템플릿
// 일반 템플릿
// 일반 템플릿
// double에 대한 템플릿 특수화​


마찬가지로 함수 템플릿 특수화도 존재한다.

#include <iostream>
#include <string.h>

// 일반 적인 함수 템플릿
template < typename T >
int ShowType( T n )
{
	std::cout << "일반 함수 템플릿" << std::endl;
	return sizeof(n);
}

// 특수화 템플릿 선언
template<>
int ShowType( char* c )
{
	std::cout << "char*에 대한 함수 템플릿 특수화" << std::endl;
	return strlen(c);
}

void main()
{
	int iA = 10;
	double dA = 20;
	char* cpB = "test12345";
	// int형과 double형에 대해서는 일반 템플릿을 실행
	std::cout << ShowType( iA ) << std::endl;
	std::cout << ShowType( dA ) << std::endl;
	// char*에 대해서는 함수 템플릿 특수화를 실행하는 것을 확인.
	std::cout << ShowType( cpB ) << std::endl;
	
}
// 결과
// 일반 템플릿
// 4
// 일반 템플릿
// 8
// char*에 대한 함수 템플릿 특수화
// 9​



주의 할 점은, 만약
일반 함수 템플릿의 경우

template < typename T >
int ShowType( const T& n )​

로 선언을 해 주었다면,
특수화 템플릿에서도

template <>
int ShowType( /*이와 같은 형식 const T&*/ n )
// T는 특수화 처리될 float나 double나 char...
// 대신 꼭 뒤에 &가 붙어야 한다.​

으로 해 주어야 한다는 것이다.