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