LANG/C++

[C++]13-1.템플릿에 대한 이해와 함수 템플릿

혀니리리 2023. 5. 26. 15:00
728x90

1. 함수 템플릿은 함수를 만들어 낸다. 함수의 기능은 결정되어 있지만, 자료형은 결정되어 있지 않아서 결정해야 한다. 

template <typename T>  //T라는 이름을 이용해서 아래의 함수를 템플릿으로 정의한다.
T Add(T num1, T num2)
{
	return num1 + num2;
}

template <typename T> = template <class T>

 

자동 형변환해주는 것을 볼 수 있음.

 

한 번 함수가 만들어지면, 그 다음에는 만들어진 함수를 호출할 뿐, 새로운 함수를 만들지는 않음.

12, 13행에서 함수가 만들어지면, 14,15행에서 문장을 컴파일할 때는 앞서 만들어놓은 두 함수를 호출할 뿐임

즉, 함수는 자료형 당 하나만 만들어짐.

 

자료형을 붙이지 않으면 자동으로 자료형을 할당해줌

 

'함수 템플릿': 앞서 보인 다음의 정의와 같은 것

template <typename T>
T Add(T num1, T num2)
{
	return num1 + num2;
}

'템플릿 함수': 위의 템플릿을 기반으로 컴파일러가 만들어내는 유형의 함수들

int Add<int>(int num1, int num2)
{
	return num1 + num2;
}

double Add<double>(double num1, double num2)
{
	return num1 + num2;
}

 

2.둘 이상의 형에 대해 템플릿 선언하기

쉼표를 이용해서 둘 이상의 템플릿 타입 명시 가능!

 

3.함수 템플릿의 특수화

상황에 따라서 템플릿 함수의 구성방법에 예외를 둘 필요가 있을 때 사용됨.

#include <iostream>
#include <cstring>
using namespace std;

template<typename T>
T Max(T a, T b)
{
    return a > b? a: b;
}

template <>
char* Max(char* a, char* b)
{
    cout << "char* Max<char *>(char* a, char* b)" << endl;
    return strlen(a) > strlen(b) ? a: b;
}

template <>
const char* Max(const char* a, const char* b)
{
    cout << "const char* Max<const char *>(const char* a, const char* b)" << endl;
    return strcmp(a, b) > 0 ? a: b;
}

int main(void)
{
    cout << Max(11, 15) << endl;
    cout << Max('T', 'Q') << endl;
    cout << Max(3.5, 7.5) << endl;
    cout << Max("Simple", "Best") << endl;

    char str1[] = "Simple";
    char str2[] = "Best";
    cout << Max(str1, str2) << endl;
    return 0;
}

char* 형 함수는 내가 이렇게 제시를 하니, const char*형 템플릿 함수가 필요한 경우에는 별도로 만들지 말고 이것을 써라!

 

728x90