클래스 템플릿
클래스도 함수와 같이 템플릿을 가질 수 있다.
template<typename T>
class CObj
{
public:
CObj() {}
CObj(T _x, T _y) : m_Y(_y) {}
~CObj() {}
public:
void Render();
T Add(T a, T b);
private:
static T m_X;
T m_Y;
};
template<typename T>
T CObj<T>::m_X = 0;
클래스 템플릿의 static 멤버 변수는 맨 아래줄처럼 초기화를 해줘야 사용할 수 있다.
그러면 템플릿 클래스별로 static 멤버 변수를 공유하게 된다.
template<typename T>
T CObj<T>::Add(T a, T b)
{
m_X += a + b;
return m_X;
}
int main()
{
CObj<int> Obj;
Obj.Add(10, 20);
cout << Obj.Add(30, 40) << endl; // 100
CObj<double> Obj2;
Obj2.Add(1.1, 2.2);
cout << Obj2.Add(3.3, 4.4) << endl; // 11
}
템플릿 클래스 CObj의 멤버함수 Add를 템플릿으로 만들어주고 두개의 매개변수를 받아 static 멤버 변수 m_X에 더한다.
이 경우 자료형이 같은 경우끼리만 메모리 공간(static 멤버 변수)이 공유된다.
예제 코드에서는 멤버 함수 템플릿을 꺼내서 작성했지만 보통 인라인화를 위해 헤더파일(클래스 선언부)에 작성한다.
template<typename T>
class CPlayer : public CObj<T>
{
};
클래스 템플릿을 상속 받는 클래스 템플릿을 만들 수도 있다.
template<>
class CObj<char*> // 템플릿 특수화에 의해 만들어진 클래스 템플릿
{
public:
char* Add(char* a, char* b)
{
int iLength = strlen(a) + strlen(b);
char* pString = new char[iLength + 1];
strcpy_s(pString, iLength + 1, a);
strcat_s(pString, iLength + 1, b);
return pString;
}
};
// 원형의 이항 템플릿
template<typename T1, typename T2>
class CTest {};
// 부분 특수화의 예 1
template<>
class CTest<int, char*> {};
// 부분 특수화의 예 2
template<typename T>
class CTest<T, char*> {};
함수 템플릿처럼 특정 자료형에 대해 특수화를 할 수 있고,
이항 템플릿을 사용해 둘 중 하나만 부분 특수화를 할 수도 있다.
STL(Standard Template Library)
프로그래밍에 필요한 자료구조 및 알고리즘을 템플릿화해서 제공한다.
STL의 구성요소는 컨테이너, 알고리즘, 함수 객체, 반복자가 있다.
1.컨테이너
데이터를 저장하는 객체, 즉 자료구조를 구현한 객체이다.
컨테이너는 여러 기준으로 분류할 수 있다.
-원소 배치 방법
시퀀스 컨테이너 : vector, deque, list
원소가 상대적인 위치를 유지한다.
연관 컨테이너 : set, multiset, map, multimap
원소가 key-value 쌍의 형식으로 저장된다.
-메모리 구성 방식
배열 기반 컨테이너 : vector, deque
노드 기반 컨테이너 : set,multiset, map, multimap, list
-컨테이너 어댑터
기존 컨테이너의 일부 기능만 사용 가능하고 기능이 제한되거나 변형되어 있음
stack, queue, priority queue
-근사 컨테이너
템플릿으로 완벽한 기능을 갖추지 못하며 문자만을 저장
string, wstring
2.알고리즘
정렬, 탐색, 삭제 등 알고리즘을 제공하며 대부분 알고리즘 함수 템플릿은 특정 멤버가 아닌 전역 네임스페이스에
선언되어 있다. 이들 함수는 다양한 컨테이너와 반복자를 지원하기 때문에 전역 네임스페이스에 선언되어 타입이나
이름 충돌을 최소화하기 위함이다.
3.함수 객체
https://cppking.tistory.com/218
23.02.21 - 함수 객체, 임시 객체, 템플릿
함수 객체 class CPlus { public: int operator()(int a, int b) { return a + b; } }; int main() { CPlus plus; cout
cppking.tistory.com
4.반복자
컨테이너에 포함된 원소들에 접근해 읽기와 쓰기를 하기 위한 객체
*연산자를 쓰는 등 포인터와 유사한 점이 있지만 포인터와는 전혀 다르다.
'Today I Learned' 카테고리의 다른 글
| 23.02.24 - 반복자, 알고리즘 (0) | 2023.02.24 |
|---|---|
| 23.02.23 - cout, 벡터 (0) | 2023.02.24 |
| 23.02.21 - 함수 객체, 임시 객체, 템플릿 (0) | 2023.02.21 |
| 23.02.20 - 캐스팅 연산자, 인라인 함수, 연산자 오버로딩 (0) | 2023.02.20 |
| 23.02.17 - 순수 가상 함수, 가상 소멸자, 캐스팅 연산자 (0) | 2023.02.17 |