형태
template <class <type_name>> <function_declaration>;
template <typename <type_name>> <function_declaration>;
typename과 class 차이? -> 없다 그냥 typename을 사용하면 된다.
템플릿을 인스턴스화 할 때마다 컴파일러가 내부적으로 코드를 생성
템플릿에 넣는 자료형 가지수에 비례하여 exe파일 크기 증가
컴파일 타임 도중 다형성 부여가 가능하다.
STL을 돌게하는 주된 프로그래밍 방식
코드를 중복 작성할 필요가 없어졌다.
#define MAX 3
const int MAX = 3;
static const int MAX = 3;에 대한 해결 방안
=>
class 이름
{
private:
enum { MAX = 3 }; //상수화 된다.
int Arr[MAX];
}
클래스 위에 template을 선언하여 클래스템플릿 생성이 가능하다.
선언
template<typename T>
class MyArr{...}
생성자
template<typename T>
MyArr<T>::MyArr(){...}
템플릿 프로그래밍을 하기위해서는 헤더파일에서 구현해야한다.
->cpp 안에 구현하면 컴파일러가 컴파일 할 때 함수 구현부를 찾지 못하여 에러를 발생
매개변수 종류 다른 여러가지
template <typename T, typename U>
namespace를 지정하고 함수에 템플릿을 지정하여 사용해도 된다.
ex) Math 사용(namespace에 있어서 따로 변수선언이 필요 없이 사용이 가능하다)
템플릿 특수화
특정한 템플릿 매개변수를 받도록 템플릿 코드를 커스터마이즈할 수 있다.
ex) std::vector
template <class T, class Allocator>
class std::vector<T,Allocator>{} // 모든 형을 받는 제네릭 vector
template <class Allocator>
class std::vector<bool, Allocator>{} // bool을 받도록 특수화된 vector
템플릿 특수화는 거의 쓰이지 않지만 가끔 쓰여야 하는 경우가 있다.
전체 다 매개변수가 특수화된다면 template<>를 선언
매개변수 일부분만 특수화가 된다면 template<템플릿 되는 매개변수>를 선언
장점 : 컴파일 도중 다형성 부여 가능
단점 : 코드 읽기가 어렵다
컨테이너인 경우 템플릿 프로그래밍은 좋다.
컨테이너가 아닌 경우 서넛 이상 자료형을 다루면 템플릿 프로그래밍이 좋다.
단, 두 가지 정도라면 그냥 클래스 2개를 만드는게 더 적합하다.
'C++' 카테고리의 다른 글
C++ 11/14/17/...의 키워드 (0) | 2021.12.24 |
---|---|
C++ STL 알고리듬 (0) | 2021.12.22 |
C++ 15일차 (0) | 2021.07.01 |
C++ 14일차 (0) | 2021.06.30 |
C++ 13일차 (0) | 2021.06.28 |