int Add(int num1, int num2)
{
return num1 + num2;
}
template <typename T>
T Add(T num1, T num2)
{
return num1 + num2;
}
int main()
{
int result = Add<int>(3, 5);
}
함수 템플릿은 템플릿이지 함수가 아니다.
함수 호출시 함수 이름 뒤 < > 사이에 자료형을 넣어주면 된다.
함수 템플릿을 기반으로 컴파일러가 만든 함수를 템플릿 함수라 한다.
template <typename T>
T Add(T num1, T num2)
{
return num1 + num2;
}
위의 템플릿을 기반으로
int main()
{
int result = Add<int>(3, 5);
}
을 호출하면
int Add<int>(int num1, int num2)
{
return num1 + num2;
}
와 같은 함수를 컴파일러가 생성 후 호출하게 된다.
템플릿 함수 == 함수이름<자료형>
int가 아닌 다른 자료형도 마찬가지
template <class T1, class T2> //class 키워드 대신 typename도 가능
T1 Add(T1 num1, T2 num2)
{
return num1 + num2;
}
템플릿 선언 시 class와 typebname은 동일하게 사용된다.
함수 템플릿을 선언하고 특정 자료형에 대해서는 다른 동작을 정의하고 싶을 때 사용한다.
template <typename T>
T Max (T a, T b)
{
return a > b ? a: b;
}
위와 같은 템플릿이 있을 때
int main()
{
cout << Max<int>(3, 5);
cout << Max<double>(3.14, 5.5);
//cout << Max<const char*>("Simple", "Easy"); 주소값의 대소비교를 하고 있다.
}
는 의도대로 동작한다.
하지만 문자열의 길이 비교가 목적이라면 원하는대로 동작하지 않는다.
template <typename T>
T Max (T a, T b)
{
return strlen(a) > strlen(b) ? a: b;
}
문자열에 대해서만 위와 같은 템플릿을 기반으로 함수를 생성하도록 특수화를 정의할 수 있다.
template <typename T>
T Max (T a, T b)
{
return a > b ? a: b;
}
위와 같은 템플릿이 있을때
const char* 형에 대한 특수화를 하려면
templete<> //특수화 한 함수란건 컴파일러에 알려준다
const char* Max<const char*>(const char* a, const char* b) //Max<const char*>을 미리 만들어 준다.
{
return strlen(a) > strlen(b)? a: b;
}
를 추가로 선언해 주면 된다.
templete<>
const char* Max(const char* a, const char* b)
{
return strlen(a) > strlen(b)? a: b;
}
위와 같이 함수 이름 옆의 <>를 생략할 수 있다.
하지만 <>의 자료형을 특정할 수 없을 때는 생략이 불가하다.