탬플릿

김태훈·2024년 1월 2일
0

C/C++

목록 보기
16/22

탬플릿

탬플릿은 하나의 틀.
객체를 생성하면서 자료형이 정해짐.
모든 타입에 적용 가능한 함수 또는 클래스
어떤 자료형이든 그거에 맞게 찍어 내고 싶을 때 유용함

클래스 템플릿

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;
 	
 }
 
 
 
 
 
profile
복습을 위한 핵심 내용 및 모작

0개의 댓글