# 함수 템플릿
-> 사용자가 템플릿을 만든 것을 함수 템플릿이라고 한다.
함수를 만들 때 일반적으로 매개변수나 반환값의 타입을 명시해준다.
하지만 템플릿은 자료형을 별도로 명시하지 않아도 된다.
템플릿은 다음과 같이 만든다
template <typename T>
T Add(T _a, T _b)
{
return _a+_b;
}
위에서 T는 T1, T2 또는 다른 문자를 사용해도 상관 없다.
T라는 타입을 받아서 T타입으로 반환하고 T타입의 _a와 _b를 받아서 둘을 더한 것을 return 한다는 뜻이다.
이렇게 정의를 하고
사용을 할 때에는
Add<int>(10,20);
이런식으로 <>를 사용하여 안에 T가 어떤 자료형인지 알려줘야한다.
#include "stdafx.h"
#include <iostream>
using namespace std;
template <typename T>
T Add(T _a, T _b)
{
return _a + _b;
}
int main()
{
cout << Add<int>(1, 2) << endl;
cout << Add<float>(2.3f, 3.5f) << endl;
return 0;
}
이런식으로 템플릿을 이용하면
각 자료형마다 함수를 오버로딩 해주지 않아도 된다.
-> <>안에 명시한 자료형을 토대로 실제 함수를 만들지만,
사용자가 <>안에 자료형을 명시하지 않으면 매개변수 타입에 따라 자동으로 매칭되게 된다.
2가지 이상의 자료형을 사용할 경우
template <typename T1, typenameT2> 이런식으로 typename을 여러개 정의해야 한다.
#템플릿 오버로딩
템플릿을 오버로딩 할 수 있다.
Add로 문자 두개를 잇고 싶다고 한다면
아래와 같이 템플릿을 오버로딩 할 수 있다.
#include "stdafx.h"
#include <iostream>
using namespace std;
template <typename T>
T Add(T _a, T _b)
{
return _a + _b;
}
template <> // 템플릿 오버로딩
const char* Add(const char* _a, const char* _b)
{
char* _szB = new char[strlen(_a) + strlen(_b) + 1];
strcpy_s(_szB, strlen(_a) + strlen(_b) + 1, _a);
strcat_s(_szB, strlen(_a) + strlen(_b) + 1, _b);
return _szB;
}
void main()
{
cout << Add("Hello","World") << endl;
}
#inline 함수
-> 매크로 함수의 단점인
1. 복잡한 함수 구성 어려움
2. 디버깅이 불가능
이러한 부분을 보완한 함수이다.
inline 함수는 함수 맨 앞
즉, 반환타입 앞에 inline 이라는 키워드를 명시하면 된다.
-> inline 함수는 헤더파일에 정의부까지 정의해야된다.
따라서 파일분할을 할 수 없다.
인라인 함수가 일반 함수로 변경되는 경우가 있다.
1. 인라인 함수를 함수 포인터로 이용할 경우
2. 재귀 형태로 호출하는 경우
3. 원인 불분명
'개발 Study' 카테고리의 다른 글
#36. STL (Standard Template Library) 정의 (0) | 2021.05.22 |
---|---|
#35. 클래스 템플릿 (0) | 2021.05.21 |
#33. operator 연산자 오버로딩 (0) | 2021.05.18 |
#32. 바인딩 (0) | 2021.05.14 |
#31. 캐스팅(형변환) (0) | 2021.05.14 |