템플릿 (Template)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <string>
 
// T를 템플릿 인자로 받는 템플릿 정의
template <typename T>
class Vector {
    T* data;
    int capacity;
    int length;
 
public:
    Vector(int n = 1): data(new T[n]), capacity(n), length(0){}
 
    void push_back(T s) {
        if (capacity <= length) {
            T* temp = new T[capacity * 2];
            for (int i = 0; i < length; i++) {
                temp[i] = data[i];
            }
            delete[] data;
            data = temp;
            capacity *= 2;
        }
        data[length] = s;
        length++;
    }
 
    T operator[](int i) { return data[i]; }
 
    void remove(int x) {
        for (int i = x + 1; i < length; i++) {
            data[i - 1= data[i];
        }
        length--;
    }
 
    int size() { return length; }
 
    ~Vector() {
        if (data) {
            delete[] data;
        }
    }
};
 
int main() {
    
    // 템플릿을 통해 인자로 타입을 전달
    
    
    Vector<int> int_vec;
    int_vec.push_back(3);
 
    Vector<std::string> str_vec;
    str_vec.push_back("hello");
}
cs

- 위와 같이 클래스 템플릿에 인자를 전달해 실제 코드를 생성하는 것을 클래스 템플릿 인스턴스화라고 한다.

 

 

템플릿 특수화 

 

template <typename A, typename B, typename C>

class test { };

 - 위와 같이 클래스 템플릿이 정의되어 있을때, A가 int, C가 double일때 따로 처리하고 싶다면 

 

template <typename B>

class test <int, B, double> { };

 - 와 같이 특수화 하고 싶은 부분에 원하는 타입을 전달하면 된다.

 

template <>

class test <int, int, double> { };

 - 와 같이 전달하는 템플릿 인자가 없더라도 특수화 하고 싶으면 template<>은 꼭 남겨줘야 한다. 

 

 

'c++' 카테고리의 다른 글

클래스 (Class)와 구조체 (Struct)의 차이  (0) 2020.08.28
함수 템플릿  (0) 2020.08.27
오버라이딩, 가상함수  (0) 2020.08.20
String class  (0) 2020.08.18
explicit, mutable  (0) 2020.08.18
TAGS.

Comments