-
윤성우 열혈 C++ 프로그래밍 13,14장) 템플릿(template)(함수 템플릿, 템플릿 함수, 클래스 템플릿, 템플릿 클래스, 특수화, 부분 특수화)PROGRAMMING/C++ 2024. 1. 12. 23:44
오늘은 템플릿에 대해서 정리해보고자 합니당~! 고고씽!
(혹시 저작권에 문제가 있다면 수정하겠습니다!! 개인적인 공부용으로 정리함을 알려드립니당)
https://product.kyobobook.co.kr/detail/S000001589147
함수 템플릿과 템플릿 함수
// 함수 템플릿 template <typename T> T Add(T num1, T num2){ return num1 + num2; } // 템플릿 함수 int Add<int> (int num1, int num2){ return num1 + nun2; }
- 템플릿 함수는 컴파일할 때 함수가 만들어진다. (컴파일 속도가 느려질 수는 있지만, 이는 실해속도가 아니다!)
- 컴파일러에 의해서 만들어지는 템플릿 함수는 일반함수와 구분된다.
- 템플릿 함수는 생성된(Generated) 함수라고도 불린다.
함수 템플릿의 특수화
template <typename T> T Max(T a, T b){return a > b ? a : b;} template <> char* Max<char*>(char *a, char b) {return strlen(a) > strlen(b) ? a : b;}
클래스 템플릿과 템플릿 클래스
: 함수 템플릿과 동일하게 작동하나 클래스 템플릿 기반의 객체 생성에서는 반드시 자료형을 명시하도록 하고 있다.
- 클래스 외부에 함수를 정의할 때는 template <typename T >를 적어주어 T가 누구인지 알려줘야 한다.
- 파일을 나눌 때 클래스 템플릿을 쓴다면 헤더 파일에 클래스의 생성자와 멤버함수의 정의를 모두 넣어야 한다. 이 방법이 싫다면 아예 cpp 파일을 include 해주면 된다!
템플릿 클래스의 포인터 정의하기
typedef Point<int>* POINT_PTR // 템플릿 클래스의 포인터를 정의
클래스 템플릿의 특수화
template <typename T> class A{ private : T data; } // 클래스 템플릿의 특수화 template<> class A<char *>{ private : char* data; }
🚨 전체 특수화가 부분 특수화보다 우선시된다.
T : 템플릿 매개별수 ← int : 템플릿 인자 전달
template <typename T, int len> //template <typename T = int, int len = 8> : 디폴트값도 설정 가능 class A{ private : T data[len]; } A<double, 5> darr; A<int, 5> iarr; // iarr과 darr은 서로 다른 자료형의 클래스로 구분된다. // 따라서 두 배열 객체간의 대입은 허용되지 않는다.
함수 템플릿과 static 지역변수
template <typename T> class Simple{ private: static T num; }
: static 멤버변수는 템플릿 클래스별로 유지하게 된다.
template <typename T>와 template <>
: 정의 부분에 T가 존재하면 전자를, 존재하지 않으면 후자를 선택하면 된다.
템플릿 static 멤버변수 초기화의 특수화
template <typename> T T Simple<T>::mem = 0; // 특수화 template <> long Simple<long>::mem = 100;
'PROGRAMMING > C++' 카테고리의 다른 글
윤성우 열혈 C++ 프로그래밍 16장) C++의 형 변환 연산자 (2) 2024.01.15 윤성우 열혈 C++ 프로그래밍 15장) 예외처리(try, catch, throw, 스택풀기, 예외클래스, 예외 객체) (0) 2024.01.15 윤성우 열혈 C++ 프로그래밍 11장) 연산자 오버로딩 2(대입연산자, 오버로딩, 함수 오버로딩, 스마트포인터, 펑터) (2) 2024.01.08 윤성우 열혈 C++ 프로그래밍 10장) 연산자 오버로딩 1(operator+, operator++, operator-, operator--, operator<<) (1) 2024.01.07 윤성우 열혈 C++ 프로그래밍 9장) 가상의 원리와 다중상속(멤버함수의 위치, 가상함수 테이블, 가상상속) (0) 2024.01.07