함수 템플릿은 다양한 데이터형에 대해서 호출 될 수 있는 기능을 제공하는 함수을 말합니다. 

함수의 일부 요소들이 정해지지 않는 상태로 제공되며 

정해지지 않는 요소들을 "파라미터화" 되었다고 말합니다. 

아래에 간단한 함수 템플릿 예제를 통해서 살펴봅니다. 

// 입력받은 a와 b를 비교해서 큰값을 리턴합니다. 
template<typename T>
T const & max(T const & a, T const & b)
{
	return a < b ? b : a;
}

 

max라는 함수가 정의되었습니다. 일반함수와는 다르게 상단에 template< 파라미터 목록 >을 구현합니다.

위의 예제에서는 typename T  데이터형 파라미터로 제공되었습니다. 

데이터형 파라미터를 정의할 때 typename 대신에 class를 사용해도 무방합니다. ( "template<class T>" )

데이터형의 파라미터의 경우 어떠한 타입이든 대입될 수 있습니다.(int, float, double, string, 유저가 만들 클래스.... 등등)

사용방법에 대한 예제를 보고 설명 드리겠습니다. 

#include <iostream>
#include <string>

// 입력받은 a와 b를 비교해서 큰값을 리턴합니다. 
template<typename T>
T const & max(T const & a, T const & b)
{
	return a < b ? b : a;
}

using namespace std;
int main()
{
	int i = 100;
	cout << "max(50, i) = " << ::max(50, i) << endl;

	float f = 5.6f;
	cout << "max(10.9f, f) = " << ::max(10.9f, f) << endl;

	string str1 = "ahn1";
	string str2 = "ahnjung";
	cout << "max(str1, str2) = " << ::max(str1, str2) << endl;

	return 0;
}

결과

::max(50, i) 함수가 호출 되었을 때는 T가 int로 추론되어서 실행되었습니다. 

컴파일러가 실제로 호출하게 되는 함수는 아래와 같습니다. 

int const & max(int const & a, int const & b)
{
	return a < b ? b : a;
}

::max(10.9f, f)는 float, ::max(str1, str2)는 string으로 추론되어서 실행됩니다. 

함수 템플릿의 경우 입력된 인자값을 추론하여 파라미터 값을 자동을 적용합니다. 

하지만 입력된 인자값에 의해서 추론을 할 수 없다면 에러를 발생 시킵니다. 

::max(12, 4);  // 첫번째, 두번째 인자 int 추론 가능 OK
::max(12, 3.2); // 첫번째 인자는 int, 두번째 인자는 double => 추론불가 Error

::max<double>(12, 3.2); // 명시적 파라미터 지정으로 호출 가능
::max(static_cast<double>(12), 3.2); // 첫번째 인자 double로 형변환, 두번째 인자 double 추론가능

또한 < 연산자를 지원하지 않는 타입으로 호출된다면 컴파일 타임에 오류가 발생합니다.

'c++ > template' 카테고리의 다른 글

[template] 템플릿의 인스턴스화  (0) 2019.09.22

+ Recent posts