변수 형에 대해서 오버로딩을 해서 여러가지 기능을 수행하는 함수를 중복정의를 할 수 있다.
하지만 그것 보다 더 좋은것이 존재 하니,
그것은 템플릿,
개념 자체는 어렵지 않다.
예제를 보자.
#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...
// 대신 꼭 뒤에 &가 붙어야 한다.
으로 해 주어야 한다는 것이다.
'프로그래밍 > C++' 카테고리의 다른 글
문자열 관련 함수 정리(멀티바이트->유니코드->TCHAR) (0) | 2014.01.14 |
---|---|
예외 처리(try, catch, throw) (0) | 2010.04.04 |
임시 객체 생성 (0) | 2010.04.04 |
연산자 오버로딩(operator overlonding)(2) (0) | 2010.04.04 |
연산자 오버로딩(operator overloading)(1) (0) | 2010.04.04 |