C++프로그래밍/자료구조,알고리즘(추후확장)

템플릿 기초 (함수템블릿)

season97 2024. 9. 27. 10:19

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로

C++에 대한 구체적인 정보를 담고 있지 않습니다.


▶ 템플릿

 

ㆍ 기본 개념은 함수나 클래스를 찍어내는 툴을 만든다. 

 

ㆍ 함수 템플릿과 클래스 템플릿 두 종류가 있다.

 

 

- 함수 템플릿 -

void Print(int a)
{
    cout << a << endl;
}

void Print(float a)
{
    cout << a << endl;
}

void Print(double a)
{
    cout << a << endl;
}

void Print(const char* a)
{
    cout << a << endl;
}

ㆍ 버전이 많아질수록 힘들겠다.....

template<typename T>
void Print(T a)
{
    cout << a << endl;
}

ㆍ 이 타입 자체가 정해지진 않았지만... 뭐든받겠다!


ㆍ 함수의 틀을 만들어준거고 사용하는 순간 컴파일러가 만들어준다.

int main()
{
    Print(50);
    Print(50.1f);
    Print(50.2);
    Print("hi");

    Print<int>(50);
    // 형식을 지정해 줄 수도 있다.
}

ㆍ 들어간 자료형에 따라 컴파일러가 자동으로 정해주며, 직접적으로 형식을 지정해 줄 수도 있다.

 

template<typename T>
T Add(T a, T b)
{
    return a + b;
}

ㆍ 반환타입도 임시인 T로 받을 수 있다.

 

template<typename T1, typename T2>
void Print(T1 a, T2 b)
{
    cout << a << " " << b << endl;
}

ㆍ int, char* 등등 여러가지 자료형을 받는 버전도 만들 수 있다.

 

 

★ 근데 자료형의 자리에 클래스가 들어갔다면??

class Knight
{
public:


public:
    int _hp = 12200;
};

ㆍ 이거 그냥 아무거도 안하고 템플릿에 때려박으면 오류난다...
ㆍ 클래스의 경우엔 "<<"연산자를 지원을 안하기때문에 오류가 날 것이다.

ㆍ 사용하던 cout을 타고 들어가면 ostream 이라는게 있다. 이걸 활용해서 연산자 오버로딩을 하자

ostream& operator<<(ostream& os, const Knight& k)
{
    os << k._hp;
    return os;
}

정말 다 정의해줘야 하는구나..

 

 

▶ 템플릿 특수화?
ㆍ 특정 타입에 대해서만 다르게 동작하게 하고싶을 때 사용한다.


ㆍ 기사일 경우에만 다르게 사용하고 싶다면?

 

template<>
void Print(Knight a)
{
    cout << "나이트!!!!!!!!!!" << endl;
    cout << a._hp << endl;
}

그럼 나이트의 경우에만 얘가 실행된다.

 

 

 

int main()
{
    Print(50);
    Print(50.1f);
    Print(50.2);
    Print("hi");

    Print<int>(50);
    // 형식을 지정해 줄 수도 있다.

    int result = Add<float>(5.444f, 5.111f);

    //=========
    Knight k1;
    Print(k1); 
}

'C++프로그래밍 > 자료구조,알고리즘(추후확장)' 카테고리의 다른 글

vector의 동작 원리(size / capacity)  (0) 2024.09.28
콜백함수  (0) 2024.09.27
클래스 템플릿  (0) 2024.09.27
함수객체  (0) 2024.09.27
함수포인터  (0) 2024.09.26