본문 바로가기
Script/C++

[C++] Chapter 09. 템플릿(Template) #2

by song.ift 2023. 5. 12.

템플릿 : 함수나 클래스를 찍어내는 툴

  1. 함수 템플릿
  2. 클래스 템플릿

 

클래스 템플릿 사용 전

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; }

 

💡 결론 - 어떤 타입이건 다 받아줄 수 있는 것이 템플릿

댓글