프로그래밍





2015/07/21 10:59

STL 컨테이너 - 2. 템플릿(Template) <2> C/C++

이전 포스팅 - STL 컨테이너 - 2. 템플릿(Template) <1>

다음 포스팅 - STL 컨테이너 - 3. 템플릿(Template) <3>

이전 포스팅에서는 템플릿의 기본 사용 방법에 대해 알아보았다.
그래서 이번에는 단순 변수를 템플릿화 하는걸 넘어서 함수 템플릿에 대해 알아보고 그 응용에 대해서 말해보려고 한다.


1. 함수 템플릿 (참고)

함수 템플릿의 기본 구조는 다음과 같다.

1

template<class T> void f(T t);


이전 포스팅에서 설명하지 않았지만 template <typename T> 와 template <class T> 는 같은 말이다.

즉, 템플릿에서 typename 과 class 는 같은 의미로 사용된다.


이런 함수 템플릿을 어떻게 사용하는지 다음 예제를 통해 알아보도록 하겠다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#include <iostream>

#include <string>

using namespace std;

 

template<class T> void f(T t)

{

      cout << t << endl;

}

 

template<> void f<char>(char c)

{

      cout << "char c :" <<  c << endl;

}

 

template<> void f(double d)

{

      cout << "double :d "<< d << endl;

}

int main()

{

      f(1);

      f(1.5);

      f('a');

}

Output:
1
double :d 1.5
char c :a

위 예제에서 살펴보아야 할 곳은 5, 10, 15 줄이다.

5  template<class T> void f(T t)

10 template<> void f<char>(char c)

15 template<> void f(double d)


위 3줄을 보면 각각 다른 방식으로 템플릿 void를 리턴하는 함수 f를 호출 하고 있지만, 출력은 각각 인자에 맞는 함수로 찾아가는 걸 알 수 있다.

이를 우리는 특수화라고 부른다.

위 예제에서는 각각 다른 값을 표현할 수 있다는 것을 보여주기 위해 함수를 여러개 정의했지만,

실제로 특수화를 사용하는 방식은

template<class T> void f(T*);

template<> void f<int>(int);

의 형태로 코드를 정의하게 된다.

특히 이전 포스팅에서는 template <typename T> 과 같이 템플릿 변수를 선언하고 단순히 그 변수를 매개변수로 넘겨줬지만

위 예제처럼 템플릿은 변수 뿐만 아니라 함수, 그리고 더 나아가서는 클래스와 구조체에서 사용할 수 있다.

따라서 다음 포스팅에서는 클래스 또는 구조체에서 템플릿을 어떻게 사용하는지에 대해 알아보도록 하겠다.

덧글

댓글 입력 영역