1. 클래스 템플릿
ex) 랜덤박스의 데이터를 반환하기
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;
}
int 형이 아닌 다른 여러가지 형태를 사용하고 싶으면 템플릿을 이용할 수 있다.
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;
}
int value2 = rb2.GetRandomData();
cout << value2 << endl;
}
무조건 typename만 붙여야 하는 것은 아니다.
template<typename T, int SIZE>
class RandomBox
{
public:
T GetRandomData()
{
int idx = rand() % SIZE;
return _data[idx];
}
public:
T _data[SIZE];
};
위와 같이 여러 방법으로 사용할 수 있다.
또한 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 < 10; i++)
{
rb2._data[i] = i;
}
int value2 = rb2.GetRandomData();
cout << value2 << endl;
}
템플릿으로 서로 다른 값을 가진 객체를 생성하면 둘은 독립적인 클래스로 생성된다.
2. 클래스 템플릿 특수화
template<int SIZE>
class RandomBox<double, SIZE>
{
public:
T GetRandomData()
{
int idx = rand() % SIZE;
return _data[idx];
}
public:
T _data[SIZE];
};
클래스 이름 옆에서 형식을 선언할 수 없으므로 위에 따로 선언해주어야함.
'기초 C++ 스터디 > 객체지향' 카테고리의 다른 글
8-6. 콜백(Callback) 함수 (0) | 2023.06.08 |
---|---|
8-4. 템플릿 기초(1) (0) | 2023.06.08 |
8-3. 함수 객체(Functor) (0) | 2023.06.08 |
8-2. 함수 포인터(2) (0) | 2023.06.08 |
8-1. 함수 포인터(1) (0) | 2023.06.08 |