탬플릿은 하나의 틀.
객체를 생성하면서 자료형이 정해짐.
모든 타입에 적용 가능한 함수 또는 클래스
어떤 자료형이든 그거에 맞게 찍어 내고 싶을 때 유용함
template<typename T>
class cmy
{
cmy(T _t){ a=_t;}
cmy(){}
prviate: T a;
};
template<typename T1,typename T2>
class cmy2{};//받는 자료형을 여러개 사용도 가능
cmy<int> a
//cmy(4) b; 오류, 타입 유추 불가, 위와 같이 바스켓에 자료형을 선언해야지 객체 생성 가능!!
템플릿클래스는 객체 생성 전까지는 클래스가 존재 하지 않는 것
헤더파일에 선언,정의 다 구현할 것 그래야 인식하고 필요한 자료형으로 바꿔서 분석할 수 있음
내부클래스 탬플릿을 상위 클래스에서 선언할 때에는 typename 내부클래스명로 해야함
매개변수를 통해 함수의 typename을 컴파일러가 유추 할수 있지만 명시적 호출 해주는 것이 좋다
template<typename T1>
T1 sum(T1 _num1,T1 _num2)
{
return _num1+_num2;
}
sum<int>(4,5);//명시적 호출
sum(4,5) //T가 int라는 것을 컴파일러가 유추
함수의 디폴트 매개변수와 규칙이 같다
template<typename T1,typename T2= int>
int sum(T1 _num1,T2 _num2)
{
return _num1+_num2;
}
변수에 값을 대입할순 없다(R-value-상수)
초기화는 가능
함수에서도 마찬가지로 사용 가능
template<typename T1,int a=4>
class car
{
private: int user_capacity;
T1 Velocity;
};
car<int,18>a_car;
//a가 18이 된다
template<typename T>
T sum(T1 _num1,T1 _num2)
{
return _num1+_num2;
}
틀로 만든 탬플릿을 명시적으로 찍어내서 객체화 하였다.
명시적으로 하기 위해선 앞에 template를 꼭 붙여 줘야 한다
template<int>int Sum(int num1, int num2);
template<float>float Sum(float num1, float num2);
template class car<int,float>;
명시적 인스턴스화 한 것을 명시적 전문화 한다
틀로 만들어낸 것과 내용을 달리 하고 싶을때 사용 됨
틀에 내용에 오버라이딩 한 것
밑의 전문화가 없다면 자동으로 틀에 있는 함수가 실행 된 다(오버라이딩 한것이기 때문)
(template<>을 붙여줘야 한다)
template<>
int sum(int num2,int num2)
{
assert(0!=num2)
int num3= num1/num2;
return num;
}
명시적 인스턴스화를 먼저 한후 명시적 전문화를 해야 한다
함수에서 한 것 처럼 class에서도 사용 가능한다
함수와 마찬가지로 탬플릿 클래스를 오버라이딩 하는 것이다!!
틀에 있는 모든 멤버를 빠짐없이 재정의 해줘야 한다.
template<typename T1,typename T2>
class car
{
T1 Get_usercapacity()
{
return user_cpapacity;
}
void Set_usercapacity(T1 _usercapacity)
{
user_capacity=_usercapacity;
}
private: T1 user_capacity;
T2 Velocity;
};
template class car<int,float>;//명시적 인스턴스화
template<>
class car<int,float>
{
int Get_usercapacity()
{
return user_cpapacity;
}
void Set_usercapacity(int _usercapacity)
{
user_capacity=_usercapacity;
}
float Get_Velo{return Velocityl }
private: int user_capacity;
float Velocity;
}