템플릿 (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.