함수 템플릿
템플릿: 무언가를 만들어 내기 위한 틀
템플릿은 크게 2가지로 나뉩니다. 함수 템플릿과 클래스 템플릿.
함수 템플릿: 여러 함수를 만들어 내기 위한 틀
클래스 템플릿: 여러 클래스를 만들어 내기 위한 틀
쉽게 말하면 같은 이름과 매개변수이지만 반환 타입이나 매개변수 타입이 달라서 여러개를 선언하게 되어 중복되는 함수를 줄이기 위해 정의하는 것입니다.
선언 방식
template<typename t>
함수 or 클래스 선언{
T data;
}
코드
#include <iostream>
using namespace std;
template<typename T1, typename T2>
void Print(T1 a, T2 b) {
cout << a << ", " << b << endl;
}
template<typename T, int size>
void PrintArray(T* arr) {
for (int i = 0; i < size; i++) {
cout << "[" << i << "]: " << arr[i] << endl;
}
cout << endl;
}
int main() {
Print(10, 1.5);
Print("hello", 100);
Print(1.5, "hello!");
int arr1[5] = { 10,20,30,40,50 };
PrintArray<int, 5>(arr1); //명시적 호출
double arr2[3] = { 1.1, 2.2, 3.3 };
PrintArray<double, 3>(arr2); //명시적 호출
return 0;
}
같은 Print지만 매개변수 타입이 달라서 기존에는 2개의 Print 메소드를 선언해야 했지만
template을 통해 하나의 메소드로 같은 기능을 수행할 수 있게 합니다.
클래스 템플릿
클래스도 크게 다르지 않습니다. 클래스 위에 함수와 같이 template을 선언하여 클래스를 선언하고
생성자 매개변수나 멤버변수를 템플릿으로 해주면 됩니다.
Array 클래스 템플릿
#include <iostream>
using namespace std;
template<typename T=int , int capT = 100> //디폴트 매개변수 값 int형, capacity 100 설정
class Array {
T* buf;
int size;
int capacity;
public:
explicit Array(int cap = capT) : buf(0), size(0), capacity(cap) {
buf = new T[capacity]; //T자료형 크기 * capacity 만큼 메모리 할당, 기본capacity 100제공
}
~Array() {
delete[] buf;
}
void add(T data) {
buf[size++] = data;
}
T operator[](int index) const {
return buf[index];
}
int getSize() const {
return size;
}
};
int main() {
Array<> iarr;
iarr.add(10);
iarr.add(20);
iarr.add(30);
for (int i = 0; i < iarr.getSize(); i++) {
cout << iarr[i] << " ";
}
cout << endl;
Array<double> darr;
darr.add(10.12);
darr.add(20.12);
darr.add(30.12);
for (int i = 0; i < darr.getSize(); i++) {
cout << darr[i] << " ";
}
cout << endl;
Array<string> sarr;
sarr.add("abc");
sarr.add("ABC");
sarr.add("Hello!");
for (int i = 0; i < sarr.getSize(); i++) {
cout << sarr[i] << " ";
}
cout << endl;
return 0;
}
template선언시 매개변수에 int로 해주면 기본값을 int형으로 한다는 뜻입니다.
반환값도 템플릿 매개변수로 활용할 수 있습니다.
결과
템플릿 클래스와 매개변수는 비슷한 기능을 하는 함수, 클래스가 있으면 굉장히 유용합니다.
'C++ > STL' 카테고리의 다른 글
[STL] STL 시작 (1) | 2025.03.01 |
---|---|
[STL] 4장 문제풀이 (0) | 2025.02.21 |
[STL] 함수 객체 (0) | 2025.02.20 |
[STL] 함수 포인터 - 콜백 함수 (0) | 2025.02.15 |
[STL] 함수포인터 - 멤버 함수 호출 (0) | 2025.02.15 |