■ 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) 헤더 파일에 생성자와 멤버함수의 정의를 모두 넣는다
'Coding > C & C++' 카테고리의 다른 글
C++ 예외처리 (0) | 2020.03.04 |
---|---|
C++ 연산자 오버로딩 3(포인터 , (), 형 변환 연산자) (0) | 2020.03.01 |
C++ 연산자 오버로딩 2(대입, 배열의 인덱스, new/delete 연산자) (0) | 2020.03.01 |
C++ 연산자 오버로딩 1(기본 연산자, 단항 연산자, << 연산자) (0) | 2020.02.26 |
C++ 가상 함수 (0) | 2020.02.25 |