컴공생의 다이어리
[c++] 템플릿(template) 본문
함수 오버로딩은 함수의 구현부는 동일하지만, 인자만 다른 여러 함수를 중복하여 선언한다는 문제가 있다.
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순위이다.(물론 일반함수가 존재한다면 일반함수가 가장 우선순위가 높음)
728x90
'Development > C & C++' 카테고리의 다른 글
[c++] STL(Standard Template Library) (0) | 2021.01.05 |
---|---|
[c++] 클래스 템플릿(Class Template) (0) | 2021.01.05 |
[c++] class 상속(private, protected, public) (0) | 2021.01.03 |
[c++] 문자열 스트림 (std::stringstream) (0) | 2021.01.03 |
[c++] std::ofstream 연산자 오버로딩 (0) | 2021.01.03 |
Comments