템플릿의 형태

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<intfloatdouble>(103.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

+ Recent posts