템플릿의 확장
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로 초기화 ( 특수화 )
'C++언어 > 열혈C++' 카테고리의 다른 글
C++ : Chapter -15 C++ 형변환 연산자 (0) | 2018.06.24 |
---|---|
C++ : Chapter -14 예외처리 try catch (0) | 2018.06.23 |
C++ : Chapter -12 템플릿 PART1 (0) | 2018.06.19 |
C++ : Chapter -11 연산자 오버로딩 PART2 (0) | 2018.06.17 |
C++ : Chapter -10 연산자 오버로딩 PART1 (0) | 2018.06.13 |