본문 바로가기

C++

[C++] 함수 템플릿

함수 템플릿 형식

함수 템플릿은 함수를 만들어내는 형틀이며 이 형틀에서 만들어진 함수를 템플릿 함수라고 하고, 그 과정을 구체화라고 한다. 구체화 될 때마다 구체화된 타입의 함수가 늘어나고 용량이 증가한다.

 

template <typename T>
T cast(int s)
{
     return (T)s;
} 

template <typename T>
void func(void)
{
     T v;
     cin >> v;
     cout << v;
} 

void main()
{
     unsigned i=cast<unsigned>(1234);
     double d=cast<double>(5678); 

     printf("i=%d, d=%f\n",i,d);
     func<int>();
}

 

함수 호출부에서 이름<타입>(인수)인수의 타입을 명시적으로 지정할 수 있다.

정수 1234는 unsigned, 5678은 double로 반환되고 func의 지역변수 T는 int 타입이 된다.

 

 

template <class T>
void Swap(T &a, T &b)
{
     T t;
     t=a;a=b;b=t;
} 

template <> void Swap<double>(double &a, double &b)
{
     int i,j;
     i=(int)a;
     j=(int)b;
     a=a-i+j;
     b=b-j+i;
}

void main()
{
     double a=1.2,b=3.4;
     printf("before a=%g, b=%g\n",a,b);
     Swap(a,b);
     printf("after a=%g, b=%g\n",a,b);
}

 

위 코드는 템플릿이 특정 타입에만 다르게 동작하는 특수화를 이용한 것이다. double 형에 대해서 소수부를 제외한 정수부만 교환한다. 

 

 template <> void Swap<double>(double &a, double &b)

 template <> void Swap<>(double &a, double &b)

 template <> void Swap(double &a, double &b)

 void Swap<double>(double &a, double &b)

 void Swap<>(double &a, double &b)

 

이것들은 모두 특수화 함수를 표기하는 방법이다.

 

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

[C++] 예외 처리  (0) 2022.01.07
[C++] 클래스 템플릿  (0) 2022.01.06
[C++] 순수 가상 함수  (0) 2022.01.06
[C++] 가상 함수, 가상 파괴자  (0) 2022.01.05
[C++] 포함, private 상속, public 상속  (0) 2022.01.05