함수 템플릿
함수 템플릿은 기능은 결정되어있지만 자료형이 결정되어있지 않아서 템플릿함수를 만들때 자료형을 결정해주어야한다.
template <typename T> // 다음나올 T가 템플릿이라는것을 컴파일러에게 알려주는용도, typename 대신 class 키워드를 사용하기도한다.
T Add ( T num1 , T num2 )
{
return num1+num2;
}
// 함수 템플릿
int num1=2,num2=3;
int num3 = Add<int>( num1,num2 ) ;
// 템플릿 함수
템플릿함수는 자료형당 하나씩만 만들어지며 , 동일한 자료형의 템플릿함수 사용시 만들어졌던 함수가 호출된다.
int num3 = Add(num1 , num2); //템플릿함수를 일반함수처럼 사용할수도있다.
이때는 전달되는 인자의 자료형을 참조하여 호출될 함수의 유형을 컴파일러가 결정한다.
둘 이상의 Type에 대해 템플릿선언하기
template < class T1 , class T2>
void ShowData(double num)
{
cout<<(T1)num<<" , "<<(T2)num<<endl;
}
함수 템플릿의 특수화
템플릿 함수의 구성방법에 예외를 둘 필요가있을때 함수템플릿의 특수화를 이용해서 예외를 둘 수 있다.
template < typename T>
T Max ( T a, T b)
{
return a> b ? a : b ;
}
template <> // 다음나올 함수가 함수템플릿의 특수화로 정의한것이라는것을 컴파일러에게 알려줌
char* Max ( char * a , char * b)
{
return strlen(a) > strlen(b) ? a : b ;
}
template <>
const char * Max( const char * a , const char * b) // const 오버로딩
{
return strcmp(a,b)> 0? a : b;
}
클래스 템플릿
기능과 내부의 행동이 모두 동일한데 저장하는 자료형만이 다른경우에 , 클래스 템플릿을 이용할 수 있다.
template < typename T >
class Point
{
private :
T xpos, ypos;
public :
Point (T x=0 , T y= 0) : xpos ( x ) , ypos( y ) // 디폴트값을 선언한다면 클래스 내부에서만 선언한다.
{} ;
void ShowPosition() const // 클래스템플릿에서 일반함수 정의가능
{
cout<<xpos<< ' , '<<ypos<<endl;
}
T SimpleFunc(const T& ref); // 함수외부에서 정의
};
// 클래스 템플릿
template< typename T> // 다음 나올 T가 템플릿이라는것을 컴파일러에게 전달하기위한 선언
T Point :: SimpleFunc(const T& ref)
{
,,,,
}
Point<int>(3,4);
//템플릿 클래스
템플릿클래스의 생성시에는 템플릿함수처럼 자료형 정보를 생략할수 없다.
파일을 나눌때 고려할점
컴파일러가 클래스템플릿으로 템플릿클래스를 만들때 , 클래스템플릿의 모든것을 알아야하는데 , 헤더파일에 선언된 클래스템플릿에 모든정보가 담겨있지않은경우 ( cpp 에 함수의 정의가 담겨있는경우 등 ) 컴파일에러가 발생할 수 있다 . 이 경우에는 헤더파일에 모든 선언및 정의를 담거나 , 템플릿클래스를 만드는 소스코드에 클래스템플릿의 정보가담겨있는 모든 헤더파일과 소스코드를 include 해야한다.
'C++언어 > 열혈C++' 카테고리의 다른 글
C++ : Chapter -14 예외처리 try catch (0) | 2018.06.23 |
---|---|
C++ : Chapter -13 템플릿 PART2 (0) | 2018.06.19 |
C++ : Chapter -11 연산자 오버로딩 PART2 (0) | 2018.06.17 |
C++ : Chapter -10 연산자 오버로딩 PART1 (0) | 2018.06.13 |
C++ : Chapter-9 가상의 원리와 다중상속 (0) | 2018.05.24 |