함수나 클래스를 찍어내는 틀. 함수 템플릿과 클래스 템플릿이 있다.

 

template<typename T>
template<class T> // 둘다 사용 가능함

 

함수 템플릿

 

template<typename T>
void Print(T a) { // do something }

Print(50); // 암시적
Print<int>(50); // 명시적

 

인자가 2개인 경우도 사용 가능하다.

template<typename T1, typename T2>
void Print(T1 a, T2 b)
{
	// do something
}

 

템플릿 특수화

특정 타입에 대해서만 다른 규칙을 따르도록 하고 싶을 때 사용한다 (예외 적용)

template<typename T>
void Print(T a)
{
	// do something
}

template<>
void Print(Knight a)
{
	// do something
}

 

클래스 템플릿

 

template<typename T>
class RandomBox
{
public:
	T GetRandomData()
	{
		int idx = rand() % 10;
		return _data[idx];
	}

public:

	T _data[10];
};

 

무조건 typename만 붙여줘야 하는 것은 아니다.

template<typename T, int SIZE = 10> // 기본값 설정 가능
class RandomBox
{
public:
	T GetRandomData()
	{
		int idx = rand() % SIZE;
		return _data[idx];
	}

public:

	T _data[SIZE];
};

 

단, 템플릿 인자가 다른 경우 서로 별개의 클래스로 보기때문에 클래스 이름이 같아보여도 다형성이 성립하지 않는다.

인자까지 같아야만 같은 클래스로 인식한다.

RandomBox<int, 10> rb1;
RandomBox<int, 20> rb2;
rb1 = rb2 // 불가능!

 

템플릿 특수화

template<int SIZE = 10>
class RandomBox<double, SIZE>
{
public:
	double GetRandomData()
	{
		int idx = rand() % SIZE;
		return _data[idx];
	}

public:

	double _data[SIZE];
};

 

함수는 오버로딩이 지원되기 때문에 이름이 같아도 상관 없었지만 클래스는 그렇지 않기때문에 템플릿 특수화 라는것을 명시하기 위해 클래스명에 추가로 명시를 한다.

 

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

[STL] vector  (0) 2022.08.30
[콜백 함수] 콜백 함수  (0) 2022.08.30
[콜백 함수] 함수 객체  (0) 2022.08.30
[콜백 함수] 함수 포인터  (0) 2022.08.30
[디버깅]  (0) 2022.08.30

+ Recent posts