함수 템플릿


함수 템플릿은 기능은 결정되어있지만 자료형이 결정되어있지 않아서 템플릿함수를 만들때 자료형을 결정해주어야한다.


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 해야한다.



+ Recent posts