제주 탈출 일지

템플릿 (함수, 클래스) 본문

C++

템플릿 (함수, 클래스)

귀건 2020. 8. 17. 18:20
728x90
반응형

 

함수 템플릿은 함수의 다형성을 위해서 존재하는 것이라고 한다. 한번 써보니 너무 편했다,,.,.

 

간단하게 예시를 한번 작성해보았다.

 

template <typename T>
void sum(T a, T b)
{
T x = a + b;
cout << "결과는 "<< x << " 입니다.";

}

int main()
{

int x = 5, y = 3;

sum(x, y);

return 0;
}

 

sum이라는 함수에 인자들이 어떤 것이 들어가도 모두 작동할 수 있도록 하기 위해서는 각 인자마다 다양한 오버로딩을 제공해야한다. 하지만 함수 템플릿을 사용하면 이 오버로딩이 훨씬 편해진다!!! 예시에서 나는 int형으로 타입을 지정하지 않았지만 잘 동작하는 것을 확인할 수 있었다.

 

template <typename 사용되는 인자명1, 인자명2> 이러한 형식으로 선언하고 함수를 작성해나가면 된다. 위에서 나는 T라는 인자를 typename에 작성했는데, 편의상 사용될 함수를 사용자가 보기 편한 식별자로 정하면 될 것 같다.

 

인자를 각각 다르게 해서  간단한 형변환 연산도 되는가 확인해 봤는데, 아마 우리가 된다고 생각하는 것은 다 될거같다.

 

 

또 일부 형의 경우만 특별하게 다르게 동작해야 하는 경우가 생긴다. 그럴때는 명시적 특수화를 통해서 해당 기능을 구현한다.

template <typename T> 
void sum(T a, T b);

에서, float형의 경우는 연산하지 않아야 할 필요가 있다고 가정한다.

 

template <> void sum<double>(double&, double&) { ... }; 라고 구현할 경우, double 타입 인자는 따로 구현된 함수 템플릿에서 동작하게 된다.

 

template <> 함수 타입 함수이름 <특정 타입> (함수 인자...) { .... }로 위의 함수 템플릿 원형 아래에 선언하면 된다.

 

 

클래스 템플릿

 

클래스 템플릿도 함수라는 점을 제외하면 함수 템플릿과 동일한 기능을 수행한다.

 

 

template <typename 타입이름>

class 클래스템플릿이름

{

    // 클래스 멤버의 선언

}

이런 형태로 선언한다.

멤버 함수 및 생성자도 타입과 관련된 함수라면 영향을 줄 수 있다.

 

template <typename ..>

반환형 클래스명:: 함수 이름(인자..) {}

와 같은 형태로 멤버함수를 생성한다. (생성자도 리턴 타입을 명시하지 않는 것을 제외하고는 동일하다.)

 

클래스 템플릿의 객체를 생성할 때는 반드시 해당 객체의 타입을 사용자가 명시해야 한다.

 

클래스 내부에 또 다른 클래스 템플릿도 정의할 수 있으나 잘 사용하지는 않을 것 같다..

 

또 클래스 템플릿도 명시적 특수화가 가능하다.

 

template <> class 클래스명<클래스 타입>  
{


};

와 같은 형식으로 새로 재정의를 한다는 느낌으로 사용할 수 있겠다.

 

부분적으로 특수화 할 수도 있는데, 그를 위해서는 template <특수화 하지 않을 타입> ~~ <특수화할 타입>에서 첫번째 <>부분 안에 특수화 하지 않을 인수만 넣으면 된다. 

728x90
반응형

'C++' 카테고리의 다른 글

양방향 연결리스트(DLinkedList) - C++  (0) 2020.09.03
스마트 포인터(smart pointer)  (0) 2020.08.18
추상 클래스(abstract class)  (0) 2020.08.17
오버라이딩(overriding)  (0) 2020.08.14
파생 클래스  (0) 2020.08.13
Comments