[C++] Template
C++은 Template을 통해 Generic Programming을 지원한다. (Compile time Polymorphism)
(제네릭 프로그래밍은 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식 - 위키백과)
C++에서 Template은 class 와 function으로 나뉜다.
1. Class Template
클래스들이 여러 개 있는데 자료형만 다른 경우 template을 적용해 간단하게 표현할 수 있다.
(template 선언 시 넘겨주는 type-parameter-key 값인 typename과 class는 같은 역할을 한다)
컴파일러는 Pair<int> 와 Pair<double>을 보고 template을 참고해 해당하는 class 를 만들어준다.
(template에서 T를 해당하는 타입으로 교체한다.)
template에 parameter는 여러 개 존재할 수 있고, primitive 타입도 parameter가 될 수 있다.
C++17 버전부터는 deduction을 제공해 타입을 기입하지 않아도 타입을 알아서 추론해주는 기능을 제공한다. (<>를 사용하지 않아도 된다)
항상 추론에 성공하지는 않고, 생성자 호출에서 모든 parameter를 유추 할 수 있는 경우 성공한다.
추론이 불가능한 경우 컴파일 에러가 발생한다.
template을 작성할 때 항상 하던 것 처럼 헤더 파일과 cc 파일을 따로 작성하게 되면 undefined reference to : 에러가 발생할 수 있다. (Linking 에러)
cc 파일을 바이너리 코드로 변환한 후 변환한 파일들을 Linking 까지 마쳐야 실행 가능한 파일이 되는데, template 작성 시 헤더와 cc를 분리하면 헤더 파일에는 선언만 되어 있어 main.cc 파일을 컴파일 할 때 클래스를 만들 수 없다.
따라서 헤더에 정의까지 함께 해 주는 방식을 사용해서 문제를 해결한다.
2. Function Template
Class Template과 크게 다른 점은 없다.
그런데, function template을 사용하는 도중 함수 오버로딩과 deduction이 겹치는 경우는 어떻게 처리될까?
1. 일단은 있으면 그대로 쓴다.
2. 없으면 템플릿으로 해당 함수를 만들 수 있는지 확인한다.
3. 오버로딩 규칙을 따른다. (프로모션, 컨버전...)
각 단계에서 여러 개의 함수가 가능하다면 오류를 뱉는다.
템플릿으로 생성된 함수는 <> 가 붙어있기에 재활용은 불가능하다.
'Programming Language > C++' 카테고리의 다른 글
[C++] 예외처리 (0) | 2022.12.18 |
---|---|
[C++] STL (0) | 2022.12.15 |
[C++] Design Pattern (0) | 2022.11.24 |
[C++] 정리 (1) (0) | 2022.11.23 |
[C++] OOP (5) Dynamic dispatch / Multiple Inheritance (0) | 2022.11.22 |
댓글
이 글 공유하기
다른 글
-
[C++] 예외처리
[C++] 예외처리
2022.12.18 -
[C++] STL
[C++] STL
2022.12.15 -
[C++] Design Pattern
[C++] Design Pattern
2022.11.24 -
[C++] 정리 (1)
[C++] 정리 (1)
2022.11.23