클래스 템플릿

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

클래스 템플릿

 

#include <iostream>
using namespace std;
class RandomBox{
public:
int GetRandomData()
{
int idx = rand() % 10;
return _data[idx];
}
public:
int _data[10];
};
int main(){
srand(static_cast<unsigned int>(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;
return 0;
}


 

 

 

클래스 템플릿: 예제1

 

#include <iostream>
using namespace std;
template<typename T>
class RandomBox{
public:
T GetRandomData()
{
int idx = rand() % 10;
return _data[idx];
}
public:
T _data[10];
};
int main(){
srand(static_cast<unsigned int>(time(nullptr)));
RandomBox<int> rb1;
for (int i = 0; i < 10; i++)
{
rb1._data[i] = i;
}
int value1 = rb1.GetRandomData();
cout << value1 << endl;
RandomBox<float> rb2;
for (int i = 0; i < 10; i++)
{
rb2._data[i] = i + 0.5f;
}
float value2 = rb2.GetRandomData();
cout << value2 << endl;
return 0;
}

 

 

 

#include <iostream>
using namespace std;
template<typename T, int SIZE>
class RandomBox{
public:
T GetRandomData()
{
int idx = rand() % SIZE;
return _data[idx];
}
public:
T _data[SIZE];
};
int main(){
srand(static_cast<unsigned int>(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<int, 20> rb2;
for (int i = 0; i < 20; i++)
{
rb2._data[i] = i + 0.5f;
}
int value2 = rb2.GetRandomData();
cout << value2 << endl;
return 0;
}


 

 

템플릿 특수화

 

#include <iostream>
using namespace std;
template<typename T, int SIZE>
class RandomBox{
public:
T GetRandomData()
{
int idx = rand() % SIZE;
return _data[idx];
}
public:
T _data[SIZE];
};
// 템플릿 특수화
template<int SIZE>
class RandomBox<double, SIZE){
public:
double GetRandomData()
{
cout << "RandomBox Double" << endl;
int idx = rand() % SIZE;
return _data[idx];
}
public:
double _data[10];
};
int main(){
srand(static_cast<unsigned int>(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.5f;
}
double value2 = rb2.GetRandomData();
cout << value2 << endl;
return 0;
}


 

 

클래스 템플릿: 예제 2

 

#include <iostream>
using namespace std;
template<typename T, typename U>
class TemplateClass
{
private:
T Num1;
U Num2;
public:
TemplateClass()
{
Num1 = 0;
Num2 = 0;
};
TemplateClass(T num1, U num2)
{
Num1 = num1;
Num2 = num2;
}
void Print() const
{
cout << Num1 << " : " << Num2 << endl;
}
T Add(const T num1, const U num2)
{ return num1 + num2; }
// 클래스 안에 템플릿 함수를 선언합니다.
// 해당 형식은 클래스를 선언할 때 클래스의 T 형식으로
// 전환되지 않습니다.
template<typename T>
T Sub(const T num1, const T num2)
{ return num1 - num2; }
};
int main()
{
TemplateClass<int, float> sample1(10, 20.14f);
sample1.Print();
cout << sample1.Add(30, 40) << endl;
cout << sample1.Sub<double>(1.5, 0.5) << endl;
cout << sample1.Sub<int>(30, 10) << endl;
return 0;
}


 

'⭐ Programming > C++' 카테고리의 다른 글

[C++]L-value와 R-value, R-value reference  (0) 2022.04.24
[C++] 콜백 함수 (Callback function)  (0) 2022.04.17
[C++] 템플릿(Template) 1: 함수 템플릿  (0) 2022.04.16
[C++] 함수 객체  (0) 2022.04.16
[C++] 함수 포인터 2  (0) 2022.04.16