#include
using namespace std;
int Max(int a, int b) {return a > b ? a : b;}
double Max(double a, double b) { return a > b ? a : b; }
void main()
{
printf("%d\n", Max(1, 2));
printf("%f\n", Max(10.22, 2.34));
}
type 에 따라 각 함수를 정의하는 것은 비효율적이다.
#include
using namespace std;
#define MAKE_MAX(T) T Max(T a, T b) { return a > b ? a : b; }
MAKE_MAX(int)
MAKE_MAX(double)
void main()
{
printf("%d\n", Max(1, 2));
printf("%f\n", Max(10.22, 2.34));
}
매크로를 이용하여 타입을 정의할 수 있고 좀 더 효율적이다.하지만, 매크로는 컴파일러가 아닌 전처리기가 다루는 것이기 때문에 문제점이 있다.
(e.g, 이항연산자 처리 시 문제가 발생한다. 전처리기는 타입 체크를 하지 않는다.)
#include
using namespace std;
template T Max(T a, T b) { return a > b ? a : b; }
void main()
{
//printf("%d\n", Max('A', 2)); //error
printf("%d\n", Max('A', 2));
}
매크로를 template 으로 변경한다.template은 컴파일러가 다루는 부분이고, 타입 체크를 할 수 있고 이항연산자 문제를 해결할 수 있다.
printf("%d\n", Max('A', 2));
위 코드에서 'A'는 ASCII 코드 65로 처리되지 않는다.template function 을 사용할 때, 타입을 명시적으로 선언해줘야
컴파일러가 그 타입에 맞게 변경하여 template function 을 호출하게 된다.
정리 :
함수 템플릿은 템플릿의 인자를 생략하는데,
이는 컴파일러가 컴파일 타임에 타입을 추론하여(암시적)
기계어 코드를 생성하므로 굳이 타입을 명시적으로 사용할 필요가 없다.
다만, 사용자가 템플릿 타입을 명시적으로 사용하고 싶다면 아래와 같이 타입을 선언해서 쓸 수 있다.
printf("%d\n", Max<int>('A', 2));
Android Framework에서도 IBinder를 asInterface 로 제공하는데
Google 에서 interface_cast
결국엔 interface_cast 도 function template이다.
댓글 없음:
댓글 쓰기