본문 바로가기

Study/C++

[C++] Template

T

  • T는 자료형을 결정짓지 않는담는 뜻이다.
template <typename T>;
template <class T>;
  • 둘 이상의 형에 대해 템플릿 선언을 위해서는 다음과 같이 하면 된다.
template <typename T1, typename T2>;

 

  • 템플릿 함수 간에는 오버로딩 또한 가능하며, 일반함수와 템플릿 함수간의 오버로딩도 가능하다.

함수 템플릿의 특수화(Specialization)

  • 상황에 따라 템플릿 함수의 구성방법에 예외를 두는 경우를 말한다. 즉, 특정 매개변수에 대해서는 별도처리가 필요한 경우 사용한다.
  • 템플릿 함수의 경우, 명시적 특수화만이 존재한다.
template <typename T>
T max(T a, T b){
   return (a > b ? a : b);
}

template<>
double max(double a, double b)
{
   return (a > b ? a : b);
}
  • 즉, 위와 같은 코드에서 double형이 들어올 경우, 특수화된 템플릿 함수가 호출된다.

클래스 템플릿

  • 클래스를 생성할때에도 템플릿을 이용하여 자료형을 부여할 수 있다.
    단, 템플릿 함술르 호출할 때에는 자료형 정보의 생략이 불가능하다.
  • 클래스 템플릿도 멤버함수를 클래스 외부에 정의하는 것이 가능하다. 예는 다음과 같다.
template <typename T>
class SimpleTempalte
{
public:
	T SimpleFunc(const T& ref);
};

template <typename T>
T SimpleTemplate<T>::SimpleFunc(const T& ref)
{
	.	.	.
}

포인터 템플릿

  • 지정 대상에 따라 템플릿 객체를 생성할 때 다양한 방법이 사용될 수 있다. 가령,
tmp<int> tmpr(50);
tmp<Point<int>> tmpr(50);	// 객체 템플릿
tmp<Point<int>*> tmpr(50);	// 포인터 템플릿
  • 도 가능하다.

클래스 템플릿 특수화

  • 클래스 템플릿을 특수화하는 이유는 특정 자료형을 기반으로 생성된 객체에 대해, 구분이 되는 다른 행동양식을 적용하기 위함이다.
template <typename T>
class AAA
{
	.	.	.
}

template <>
class AAA<int>
{
	.	.	.
}
  • 위와 같은 상황에서 AAA<int> tmp; 생성 시 아래에 존재하는 클래스가 호출된다.
  • 부분 특수화도 가능하다.
template<typename T1, typename T2>
class AAA { .	.	. }

template<typename T1>
class AAA<T1, int> { .	.	. }

템플릿 인자

  • 템플릿 매개변수에는 변수의 선언이 올 수 있다. (생성자를 써도 괜찮지만, len 길이에 따라 다르게 생성된 객체는 서로 다른 형(type)으로 처리할 수 있다!)
template <typename T1, int len>
class AAA
{
private:
	T1 arr[len];
    .	.	.
}
AAA<int, 10> tmp;
AAA<int, 15> tmp2;

tmp = tmp2; // Compile Error
  • 템플릿 매개변수에는 변수의 선언이 올 수 있다.
template <typename T1, int len = 100>
class AAA
{
private:
	T1 arr[len];
    .	.	.
}

  • 정의 부분에 T가 존재하면 T에 대한 설명을 위해 <typename T>으 ㅣ형태로 덧붙이면 되고, T가 존재하지 않을 경우에는 <>형태로 간단하게 선언하면 된다.

'Study > C++' 카테고리의 다른 글

[C++] Header File  (0) 2023.10.22
[C++] Exception  (0) 2023.10.15
[C++] Operator Overloading part.2  (0) 2023.10.15
[C++] Operator Overloading  (0) 2023.10.13
[C++] Virtual principle and Multiple Inheritance  (0) 2023.10.10