템플릿의 확장


template<typename T>


T에 템플릿 클래스 ( Point <int >등 ) 을 인자로 받을 수 있다.

BoundCheckArray<Point<int>>(oparr(50);


특정 템플릿 클래스의 객체를 인자로 받는 일반함수의 정의와 friend 선언


Point<int> 와 같은 템플릿클래스의 자료형을 대상으로도 템플릿이아닌 일반함수의 정의가 가능하며 , 클래스 템플릿 내에서 이러한 함수를 대상으로 friend 선언도 가능하다.


template < typename T>

class Point

{

....

friend Point<int> operator+(const Point<int>& ,const Point<int>& );

}

Point <int> operator+( const Point<int>& pos1, const Point<int>& pos2)

{

return Point<int>(pos1.xpos+pos2.xpos,pos1.ypos+pos2.ypos);

}


클래스 템플릿의 특수화


클래스 템플릿을 특수화하는 이유는 특정 자료형을 기반으로 생성된 객체에 대해 구분이되는 다른 행동양식을 적용하기 위해서이다.


template < typename T>

class SoSimple

{

public:

T SimpleFunc( T num)

{

..    

}

};

template <>

class SoSimple<int> // 클래스템플릿 특수화

{

public :

int SimpleFunc(int num)

};


SoSimple<int> obj1 // 특수화된 템플릿을이용해 객체생성

SoSimple<double> obj2 // 클래스템플릿을이용해 객체생성


클래스 템플릿의 부분특수화


template <typename T1, type name T2> // 특수화되지않은 클래스템플릿

template <char , int > // 전체특수화된 클래스 템플릿

template < typename T1, int > // 부분특수화된 클래스템플릿


객체를 생성할때 , 전체특수화가 부분특수화보다 우선시된다.

ex )

Point <char , int> (A , 2) 일때 , 전체특수화된 클래스템플릿으로 객체생성


템플릿 인자


T 또는 T1 , T2 와같은 문자를 가리켜 템플릿 매개변수라고하며 , 템플릿 매개변수에 전달되는 자료형 정보를 가리켜 템플릿인자라고한다.


템플릿 매개변수에는 변수의 선언이올수있다


template < typename T , int len > 


SimpleArray<int , 5 > i5arr; // len을 5로 치환

SimpleArray<int , 7 > i7arr; // len을 7로 치환


위 객체의 자료형은 서로 다른 자료형이다 . 따라서 두 배열간의 대입등은 불가능하다 . 이렇듯 템플릿 매개변수에 값을 전달받을 수 있는 변수를 선언하면 변수에 전달되는 상수를 통해서 서로 다른 형의 클래스가 생성되게 할 수 있다.


템플릿 매개변수는 디폴트값 지정도 가능하다


template < typename T = int , int len = 7>

SimpleArr<> arr;  // 디폴트값을 이용해 객체를 생성할때도 클래스 템플릿을 이용한 객체생성이기때문에 <> 기호를 반드시 추가해야한다.


템플릿과 static


 template < typename T >

void ShowStaticValue(void)

{

static T num = 0;

num +=1;

cout << num << endl;

}


함수 템프릿 내에 지역변수 num 이 static 으로 선언되었을때 , 컴파일러는 함수템플릿을 기반으로 템플릿함수들을 만들어내고 , 지역변수 또한 템플릿 함수별로 각각 존재하게된다.


void ShowStaticValue(void)

{

static int  num = 0;

num +=1;

cout<< num<< endl;

}

void ShowStaticValue(void)

{

static double num = 0;

num +=1;

cout << num<<endl;

}


두 num은 같은 자료형끼리만 num 값을 공유한다.


클래스 템플릿과 static 멤버변수


static 멤버변수는 변수가 선언된 클래스의 객체간 공유가 가능한 변수이다. 이때도 , 템플릿클래스별로 ( 자료형별로 ) static 멤버변수를 유지하게된다.


template<typename T> 와 template <> 를 쓰는시기


템플릿 함수나 템플릿 클래스를 선언할때 , 정의부분에 T가 존재하면 T 에대한 설명을 위해서 <typename T> 의 형태로 덧붙이고 , T 가 존재하지않으면 <>로 간단하게 선언한다.


템플릿 static 멤버변수 초기화와 특수화


tempalte <typename T>

T simpleStaticMem ::mem = 0; // 모든 자료형에대해서 mem값 0으로 초기화

long SimpleStaticMem :: mem = 5; // long 자료형에대해서는 mem값 5로 초기화 ( 특수화 )



+ Recent posts