템플릿의 형태
1
2
3
4
5
|
template <typename T>
T 함수이름(T _a, T _b)
{
}
|
cs |
#1. 함수와 템플릿
-> 템플릿 함수
1
2
3
4
5
|
template <typename T>
T Add(T _a, T _b)
{
return _a + _b;
}
|
cs |
-> 컴파일 중 템플릿을 호출하는 코드라인을 컴파일할 때
-> 컴파일러가 실제 함수의 코드를 생성한다.
-> <>안에 명시한 자료형이 함수 템플릿에서 정의한 T자리에 매칭이 된다.
-> 사용자가 <>를 명시하지 않을 경우 인자의 타입에 따라 템플릿 함수가 생성된다.
-> 템플릿 함수는 일반적으로 포인터간의 + 연산은 불가능하다.
-> 하지만 템플릿의 특수화(오버로딩)를 통해서 합치는 방법이 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
template <>
char* Add(char* _a, char* _b)
{
char* pStr = new char[strlen(_a) + strlen(_b) + 1];
strcpy_s(pStr, strlen(_a) + strlen(_b) + 1, _a);
strcat_s(pStr, strlen(_a) + strlen(_b) + 1, _b);
return pStr;
}
void main()
{
char* pStr = Add<char*>("Hello", "World");
cout << pStr << endl;
delete[] pStr;
}
|
cs |
두 가지 이상의 자료형을 사용하는 경우
1
2
3
4
5
6
7
8
9
10
11
12
|
template <typename T1, typename T2, typename T3>
T3 Add(T1 _a, T2 _b)
{
return _a + _b;
}
void main()
{
double dA = Add<int, float, double>(10, 3.14f);
cout << dA << endl;
}
|
cs |
클래스 템플릿
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
template <typename T>
class CObj
{
public:
CObj() {}
CObj(T _a, T _b) : m_A(_a), m_B(_b) {}
private:
T m_A;
T m_B;
};
void main()
{
CObj<int> ObjInt;
CObj<float> ObjFloat;
}
|
cs |
템플릿의 파일 분할
-> 템플릿은 파일 분할을 하지않는다.
-> 파일 분할을 하게되면 다른 소스파일에서 선언 하였을 때,
-> 해당 템플릿의 정의부를 알 수 없기 때문에 컴파일러가 템플릿 클래스를 생성할 수가 없다.(링커 오류가 발생)
-> 템플릿 클래스는 선언한 코드라인을 컴파일 할 때 생성한다.
-> 그러므로 템플릿을 사용할 때는 헤더파일에 선언과 정의를 같이 해줘야 한다.
템플릿의 상속
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
template <typename T>
class CObj
{
public:
void Func()
{
}
};
template <typename T>
class CPlayer : public CObj<T>
{
};
|
cs |
#1. 어떤 자료형을 사용하는 클래스인지 알려주어야 한다.
#2. T는 무엇인지 알려주어야 한다.
템플릿과 static
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
|
template <typename T>
class CObj
{
public:
void Func()
{
m_Static += 1;
cout << m_Static << endl;
}
private:
static T m_Static;
};
template <typename T>
T CObj<T>::m_Static = 0;
void main()
{
CObj<int> objInt;
objInt.Func(); // 1
objInt.Func(); // 2
objInt.Func(); // 3
CObj<int> objInt2;
objInt2.Func(); // 4
objInt2.Func(); // 5
objInt2.Func(); // 6
CObj<float> objFloat;
objFloat.Func(); // 1
}
|
cs |
-> 같은 자료형을 사용하는 템플릿 클래스끼리만 static 변수를 공유한다.
-> 자료형이 달라질 경우 static 변수는 공유하지 않는다.(재 생성)
'Programming > C++ Basic' 카테고리의 다른 글
C++ 시간 복잡도 (0) | 2020.09.27 |
---|---|
C++ 함수 객체 (0) | 2020.09.23 |
C++ 임시 객체 (0) | 2020.09.23 |
C++ 연산자 오버로딩(operator) (0) | 2020.09.23 |
C++ 인라인 (0) | 2020.09.23 |