1. 템플릿

함수나 클래스를 찍어내는 틀.

함수 템플릿과 클래스 템플릿이 있다.

 

2. 함수 템플릿

(1) 정의

숫자를 출력하는 함수를 만든다.

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

int main()
{
    Print(50);
}

여기서 Print 함수는 int 형으로만 출력이 가능하다.

물론 이를 함수 오버로딩을 이용하여 float 형이나 double 형 등등으로 만들 수 있지만 매개 변수 부분만 다르게 설정할 수 있도록 하면 더 편할 것 같다.

이 때 템플릿을 활용할 수 있다.

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

함수를 main 함수 내에서 호출할 때마다 컴파일러가 형식을 결정한다.

단, 명시적으로 형식을 결정해 줄 수 있다.

 

int main()
{
    Print(50);
    Print<int>(50.0f); // 명시적으로 호출
    
}

 

(2) 함수 자체의 타입도 바꾸기

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

 

(3) 매개 변수를 여러개 쓰는 템플릿

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


int main()
{
    Print(50);
    Print<int>(50.0f); // 명시적으로 호출

    Print(10, 20);
    
}

 

3. 템플릿 특수화

class Knight
{
public:

public:
    int _hp = 100;
};

int main()
{
    Print(k1); // 오류 발생
}

오류를 확인하면 cout << 에서 오류가 발생한 것을 알 수 있다.

따라서 연산자 오버로딩을 해본다.

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

int main()
{
    Knight k1;
    Print(k1);
}

이번엔 연산자 오버로딩 없이 작동하는 방법을 알아본다.

클래스만 예외적으로 작동하는 것 처럼 예외로 만드는 것을 템플릿 특수화라고 한다.

template<>
void Print(Knight a)
{
    cout << a._hp << endl;
}

 

'기초 C++ 스터디 > 객체지향' 카테고리의 다른 글

8-6. 콜백(Callback) 함수  (0) 2023.06.08
8-5. 템플릿 기초(2) - 클래스 템플릿  (0) 2023.06.08
8-3. 함수 객체(Functor)  (0) 2023.06.08
8-2. 함수 포인터(2)  (0) 2023.06.08
8-1. 함수 포인터(1)  (0) 2023.06.08