[13-1] 함수 템플릿

dd_ddong·2022년 8월 24일
0

c++

목록 보기
37/38

함수 템플릿과 템플릿 함수

1. 일반 함수의 템플릿화

  1. 일반 함수
int Add(int num1, int num2)
{
	return num1 + num2;
}
  1. 템플릿화
template <typename T>
T Add(T num1, T num2)
{
	return num1 + num2;
}

int main()
{
	int result = Add<int>(3, 5);
}

함수 템플릿은 템플릿이지 함수가 아니다.
함수 호출시 함수 이름 뒤 < > 사이에 자료형을 넣어주면 된다.

2. 템플릿 함수

함수 템플릿을 기반으로 컴파일러가 만든 함수를 템플릿 함수라 한다.

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

위의 템플릿을 기반으로

int main()
{
	int result = Add<int>(3, 5);
}

을 호출하면

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

와 같은 함수를 컴파일러가 생성 후 호출하게 된다.
템플릿 함수 == 함수이름<자료형>

int가 아닌 다른 자료형도 마찬가지

3. 둘 이상의 Type 템플릿 선언

template <class T1, class T2> //class 키워드 대신 typename도 가능
T1 Add(T1 num1, T2 num2)
{
	return num1 + num2;
}

템플릿 선언 시 class와 typebname은 동일하게 사용된다.

함수 템플릿 특수화(Specialization)

필요성

함수 템플릿을 선언하고 특정 자료형에 대해서는 다른 동작을 정의하고 싶을 때 사용한다.

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

위와 같은 템플릿이 있을 때

int main()
{
	cout << Max<int>(3, 5);
    cout << Max<double>(3.14, 5.5);
    //cout << Max<const char*>("Simple", "Easy"); 주소값의 대소비교를 하고 있다.
}

는 의도대로 동작한다.
하지만 문자열의 길이 비교가 목적이라면 원하는대로 동작하지 않는다.

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

문자열에 대해서만 위와 같은 템플릿을 기반으로 함수를 생성하도록 특수화를 정의할 수 있다.

const char*형에 대한 특수화

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

위와 같은 템플릿이 있을때
const char* 형에 대한 특수화를 하려면

templete<> //특수화 한 함수란건 컴파일러에 알려준다
const char* Max<const char*>(const char* a, const char* b) //Max<const char*>을 미리 만들어 준다.
{
	return strlen(a) > strlen(b)? a: b;
}

를 추가로 선언해 주면 된다.

특수화하는 자료형의 생략

templete<>
const char* Max(const char* a, const char* b)
{
	return strlen(a) > strlen(b)? a: b;
}

위와 같이 함수 이름 옆의 <>를 생략할 수 있다.
하지만 <>의 자료형을 특정할 수 없을 때는 생략이 불가하다.

0개의 댓글