컴공생의 다이어리

[c++] 템플릿(template) 본문

Development/C & C++

[c++] 템플릿(template)

컴공 K 2021. 1. 4. 05:09

함수 오버로딩은 함수의 구현부는 동일하지만, 인자만 다른 여러 함수를 중복하여 선언한다는 문제가 있다.

int ADD(int a, int b){
	return a+b;
}

double ADD(double a, double b){
	return a+b;
}

 

 

템플릿(template)

템플릿은 함수 오버로딩에서 발전된 형태이다.

//T라는 이름(type name)에 대해서, 다음에 정의하는 대상을 템플릿으로 선언
template <typename T>

T ADD(T a, T b){
	return a+b;
}

int main(){
	cout<<ADD(10,50)<<endl;			//정수형(int)으로 인식
	cout<<ADD(10.5,15.5)<<endl;		//실수형(double)으로 인식
	return 0;
}

 

서로 다른 자료형의 템플릿을 사용하려면 아래와 같이 코드를 작성하면 된다.

template <typename T1,typename T2>

void showData(T1 a, T2 b){
	cout<<"a : "<<a<<endl;
	cout<<"b : "<<b<<endl;
}

int main(){
	showData(10,10.5);
	return 0;
}

 

 

 

특수화(specialization)

템플릿 함수를 사용하지만, 특정 매개변수에 대해서는 별도처리를 하고 싶은 경우 특수화 개념을 이용한다. 특수화에는 명시적(explicit), 부분(partial) 특수화가 존재한다. 템플릿 함수에서는 명시적 특수화만 가능하니, 부분 특수화는 템플릿 클래스에서 설명하겠다.

#include<iostream>
using namespace std;
template <typename T>
T max(T a, T b){
   return (a > b ? a : b);
}

template<>
double max(double a, double b){
   cout << a << "와 " << b << "중 큰수는 ? " <<endl;
   return (a > b ? a : b);
}

int main(){
  cout << max(5, 7) << endl;
  cout << max(15.1, 16.7) << endl;
  return 0;
}

오버라이딩과 비슷한 것 같기도 한 명시적 특수화이다. double형에 대해서만 아래 특수화된 템플릿 함수가 호출되게 한다.

 

 

템플릿 함수 오버로딩

템플릿 함수는 오버로딩도 가능하다. 템플릿 함수 간의 오버로딩 뿐만아니라 일반함수와 템플릿 함수간의 오버로딩도 가능하다.

#include<iostream>
using namespace std;
template <typename T>
T area(T a, T b) {
	return a * b;
}

template<typename T>
double area(T a, double b){
	return a * a * b;
}

int main(){
	cout << area(5, 8) << endl;
	cout << area(9, 5.14) << endl;
	return 0;
}

오버로딩 된 템플릿 함수를 통해서 다양하게 템플릿 함수를 활용할 수 있다. 하지만 주의할점은 오버로딩과 특수화를 동시에 사용하게 되면 명확하지 않은 템플릿 함수가 생길 수 있다.

 

템플릿 함수의 우선순위는 특수화가 우선수위가 가장 높고, 이후에는 알맞은 코드가 2순위이다.(물론 일반함수가 존재한다면 일반함수가 가장 우선순위가 높음)

 

 

 

modoocode.com/312

 

씹어먹는 C++ 강좌 - PDF 파일

 

modoocode.com

 

728x90
Comments