Coding/C & C++

C++ 템플릿

heyoon2j 2020. 3. 3. 17:54

 C++ 템플릿

ㆍ 함수 템플릿(Function Template)

1. 함수 템플릿의 기본 정의

- "함수 템플릿"이란 함수의 기능은 결정되어 있지만, 자료형은 결정되어 있지 않은 함수를 만드는 도구로 "함수를 만드는 데 사용되는 템플릿"

- 함수를 템플릿으로 정의하면, 컴파일러는 호출하는 자료형 당 하나씩 함수를 만든다. 그리고 "템플릿을 기반으로 만들어진 함수""템플릿 함수"라고 한다.

 

ex>

#include <iostream>

using namespace std;

 

template <class T>

T Add(T num1, T num2)

{

     return num1+num2;

}

 

int main(void)

{

     cout<< Add<int>(15, 20) <<endl;

     cout<< Add<double>(3.14, 1.86) <<endl;

}

 

=> template <class T> : T라는 이름을 이용해서 아래의 함수를 정의한다는 의미, template <class T> 대신 template <typename T>로 선언해도 된다.

=> T : 자료형을 결정짓지 않겠다는 의미로 사용

=> Add<double>(3.14, 1.86) : 호출 시 아래와 같이 함수가 만들어진다.

double Add<double> (double num1, double num2)

{

     return num1+num2;

}

 

2. 함수 템플릿의 특수화

- 상황에 따라서 템플릿 함수의 구성 방법에 예외를 둘 필요가 있다. 이때 사용되는 것이 "함수 템플릿의 특수화"이다.

 

ex>

template <class T>

T Max(T a, T b)

{

     return a>b ? a : b;

}

 

template <>

char* Max<char*>(char* a, char* b)

{

     return strlen(a)>strlen(b) ? a : b;

}

 

template <>

const char* Max<const char*>(const char* a, const char* b)

{

     return strcmp(a, b) ? a : b;

}

 

=> 위와 같이 char*, const char* 형에 대해서 특수화하였다.

 

 

ㆍ 클래스 템플릿(Class Template)

1. 클래스 템플릿의 기본 정의

- "클래스 템플릿"이란 "클래스를 만드는 데 사용되는 템플릿"

 

ex>

template <class T>

class Point

{

private:

     T xpos, ypos;

public:

     Point(T x=0, T y=0);

     void ShowPosition() const;

};

 

template <class T>

Point<T>::Point(T x, T y) : xpos(x), ypos(y)

{     }

 

template <class T>

void Point<T>::ShowPosition() const

{     ...     }

 

* 템플릿 클래스를 생성해야 하는 경우, 클래스 템플릿의 정보가 전부 필요하다. 그렇기 때문에 클래스 정의(.h 파일), 생성자와 멤버함수 정의(.cpp 파일)로의 파일 분할을 하게 되는 경우, 다음 둘 중 하나의 방법을 사용해야 된다.

 1) 헤더 파일뿐만 아니라 소스 파일도 추가해줘야 한다(#include ".cpp")

 2) 헤더 파일에 생성자와 멤버함수의 정의를 모두 넣는다