문제점
위의 코드는 문제가 있다기 보다는 엄청 귀찮다. 왜냐하면 함수 오버로딩을 이용해서 매개변수, 반환 타입별로 함수를 만들기 때문이다. Add double이면 double도 만들어줘야 한다. 정말 귀찮다. 해결방법이 뭘까??
해결책(템플릿)
template <typename T>
T Add(T a, T b)
{
return a + b;
}
int main()
{
std::cout << Add<int>(3, 10) << std::endl;
std::cout << Add<float>(3.14f, 10.14f) << std::endl;
return 0;
}
위 처럼 템플릿 함수 Add를 만들면 컴파일 시에 int형 함수, float형 함수를 따로따로 만들어 준다. (컴파일러 정말 감사..... 꿀 기능)
작동 원리
템플릿을 인스턴스화 할때마다 컴파일러가 알아서 함수를 생성해준다.
그래서 자료형 가짓수에 비례해서 exe파일이 증가한다.
템플릿 클래스 예제
#include <stdio.h>
#include <iostream>
#include <map>
template<typename T>
class MyArray
{
public:
bool Add(T data);
MyArray();
private:
enum { MAX = 3 };
int mSize;
T mArray[MAX];
};
template<typename T>
bool MyArray<T>::Add(T data)
{
if (mSize >= MAX)
{
return false;
}
mArray[mSize] = data;
mSize++;
return true;
}
template<typename T>
MyArray<T>::MyArray()
: mSize(0)
{
}
template <typename T>
T Add(T a, T b)
{
return a + b;
}
int main()
{
MyArray<int> scores;
scores.Add(10);
scores.Add(20);
scores.Add(30);
scores.Add(40);
return 0;
}
'C++' 카테고리의 다른 글
추상클래스(Abstract), 인터페이스 (0) | 2020.04.27 |
---|---|
C++ 객체 백터 Vector (0) | 2020.04.17 |
C++ iterator 개념 (0) | 2020.04.17 |
C++ 정적 바인딩, 동적 바인딩 (1) | 2020.04.09 |
C++ 멤버함수의 메모리 위치 (0) | 2020.04.09 |