템플릿 : 함수나 클래스를 찍어내는 툴
- 함수 템플릿
- 클래스 템플릿
클래스 템플릿 사용 전
class RandomBox
{
public:
int GetRandomData()
{
int idx = rand() % 10;
return _data[idx];
}
public:
int _data[10]
}
int main()
{
srand(time(nullptr));
RandomBox rb1;
for (int i = 0; i < 10; ++i)
{
rb1.data[i] = i;
}
int value1 = rb1.GetRandomData();
cout << value1 << endl;
RandomBox rb2;
for (int i = 0; i < 10; ++i)
{
rb2.data[i] = i;
}
int value2 = rb2.GetRandomData();
cout << value2 << endl;
}
두 개의 랜덤박스가 작용한다. 하지만 데이터가 float으로 들어가야 된다고하면 float를 데이터로 하는 RandomBox 클래스를 또 만들어야 한다.
클래스, 데이터가 늘어나야 할 때 마다 설계도를 수정해야하는 건 무식한 방법이 될 것이다.
클래스 템플릿 사용
// typename T를 붙이면 '조커카드' (어떤 타입도 다 넣을 수 있음)
// 그런데 무조건 typename을 붙여야 하는 것은 아니다.
// template<>안에 들어가는건 [골라줘야 하는 목록]이라고 볼 수 있음
// 두번째로 받아주는 int 값같은 경우는 추가적으로 값 기입을 해줘야하는 요구사항.
template<typename T, int SIZE = 0>
class RandomBox
{
public:
T GetRandomData()
{
int idx = rand() % 10;
return _data[idx];
}
public:
T _data[SIZE]
}
int main()
{
srand(time(nullptr));
RandomBox<int, 10> rb1;
for (int i = 0; i < 10; ++i)
{
rb1.data[i] = i;
}
int value1 = rb1.GetRandomData();
cout << value1 << endl;
RandomBox<float, 20> rb2;
for (int i = 0; i < 20; ++i)
{
rb2.data[i] = i;
}
float value2 = rb2.GetRandomData();
cout << value2 << endl;
}
응용
int main()
{
RandomBox<int, 10> rb1;
RandomBox<int, 10> rb2;
// 타입이 같아서 대입 가능
rb1 = rb2;
RandomBox<int, 10> rb1;
RandomBox<int, 20> rb2;
// 타입이 달라 대입 불가능
rb1 = rb2;
}
템플릿 특수화
template<typename T, int SIZE = 0>
class RandomBox
{
public:
T GetRandomData()
{
int idx = rand() % 10;
return _data[idx];
}
public:
T _data[SIZE]
}
// 템플릿 특수화
template<int SIZE>
class RandomBox<double, SIZE>
{
public:
double GetRandomData()
{
int idx = rand() % 10;
return _data[idx];
}
public:
double _data[SIZE]
}
int main()
{
srand(time(nullptr));
RandomBox<int, 10> rb1;
for (int i = 0; i < 10; ++i)
{
rb1.data[i] = i;
}
int value1 = rb1.GetRandomData();
cout << value1 << endl;
RandomBox<double, 20> rb2;
for (int i = 0; i < 20; ++i)
{
rb2.data[i] = i + 0.5;
}
double value2 = rb2.GetRandomData();
cout << value2 << endl;
}
💡 결론 - 어떤 타입이건 다 받아줄 수 있는 것이 템플릿
'Script > C++' 카테고리의 다른 글
[C++] Chapter 10. 콜백 함수 (Callback) (0) | 2023.05.15 |
---|---|
[C++] Chapter 08. 템플릿(Template) #1 (0) | 2023.05.12 |
[C++] Chapter 07. 함수 객체 (0) | 2023.05.12 |
[C++] Chapter 06. 함수 포인터 (0) | 2023.05.12 |
[C++] Chapter 05. 크러쉬가 나는 오작동 현상 (0) | 2023.05.12 |
댓글