함수를 짜다보면
int변수 2개 더하는 함수를 만들었는데 double를 더하는 함수도 필요하고 string도 합치는 함수가 필요한데 이름만 바꾸서 처리하기엔 너무 코드가 길어지고 찾기도 힘든 경우도 생긴다 그래서 c++에서 Template로 처리하는걸 알아보자
오버로딩을 써도 해결 할수있는거야 싶긴한데
코드를 보면 생각이 달라진다.
그러면 바로 함수 템플릿으로 설명 시작하겠습니다.
int Add(int a, int b) {
return a + b;
}
double Add(double a, double b) {
return a + b;
}
int main() {
int int_result = Add(5, 10);
std::cout << "int Add: "
double double_result = Add(3.14, 1.25);
std::cout << "double Add: " << double_result << std::endl;
return 0;
}
// 타입이 추가 될떄마다 함수를 계속 만들어줘야한다.
template <typename T>
T Add(T a, T b) {
return a + b;
}
int main() {
int int_result = Add(5, 10);
std::cout << "int Add: "
double double_result = Add(3.14, 1.25);
std::cout << "double Add: " << double_result << std::endl;
return 0;
}
만약에 string을 추가한다면 위에는 함수 하나더 생성하고 해야하지만 아래의 경우는 만들필요없이 바로 사용부터 하면 된다.
하지만 함수 뿐만 아니라 클래스도 처리가 가능하다.
클래스 안에 변수 데이터 하나를 정장하는 클래스를 예시로 들어보겠습니다.
template <typename T> // 선언 부분
class Box {
private:
T content;
public:
Box(T item) : content(item) {} // 생성자
void setContent(T item) {
content = item;
}
T getContent() const {
return content;
}
};
int main() {
Box<int> intBox(123); // int를 저장한 Box
std::cout << "intBox content: " << intBox.getContent() << std::endl;
Box<std::string> stringBox("Hello C++ Template!"); // string을 저장한 Box
std::cout << "stringBox content: " << stringBox.getContent() << std::endl;
return 0;
}
우리가 이미 사용하고있는 std::vector std::map<std::string, int> 같은 STL의 모든 컨테이너가 이 클래스 템플릿 형식으로 만들어진것입니다.
이미 사용하고있는중입니다.
응용하는것도 비슷하게 사용이 가능합니다.
std::map같은것도 보면 배열로 처리를 할수있습니다.
template <typename T, int size>
class StaticArray {
private:
T m_array[size];
public:
T& operator[](int index) {
return m_array[index];
}
};
int main() {
StaticArray<int, 10> intArray; // int 10개를 담는 배열
StaticArray<double, 5> doubleArray; // double 5개를 담는 배열
return 0;
}
이렇게 사용을 하면 고정된 크기의 배열 만들어서 처리할때도 좋습니다.