클래스 템플릿

 

인프런 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