codenuri 강석민 강사 강의 내용기반으로 정리한 내용입니다.
thin template
// Thin Template
template<typename T> class Vector
{
T* buff;
int sz;
public:
int size() const {}
bool empty() const {}
void push_front(const T& a) {}
T& front() {}
}
int main()
{
Vector<int> v1;
Vector<short> v2;
Vector<double> v3;
}
함수의 갯수를 생각해봅시다.
4개의 함수 * 3개의 타입 => 12개 함수.
함수의 개수 줄여보기
-> T를 사용하지 않는 모든 멤버는 기반 클래스로 만들자
class VectorBase
{
protected;
int sz;
public:
int size() const {}
bool empty() const {}
}
template<typename T> class Vector : public VectorBase
{
T* buff;
public:
void push_front(const T& a) {}
T& front() {}
}
int main()
{
Vector<int> v1;
Vector<short> v2;
Vector<double> v3;
}
2개의 함수 * 3개의 타입 = 6 + 기반 클래스 함수 2개 => 8개 함수.
좀 더 줄이기 위해 아예 모든 멤버를 기반 클래스로 만들자.
T를 기반 클래스로 빼고 void* 로 바꾸면 캐스팅의 불편함이 있다.
캐스팅을 책임지는 파생클래스를 템플릿으로!
class VectorBase
{
protected;
void* buff;
int sz;
public:
int size() const {}
bool empty() const {}
void push_front(const void* a) {}
void* front() {}
}
template<typename T> class Vector : public VectorBase
{
public:
inline void push_front(const T& a) {
VectorBase::push_front(static_cast<void*>(a));
}
inline T& front() {
return static_cast<T&>(VectorBase::front());
}
}
int main()
{
Vector<int> v1;
Vector<short> v2;
Vector<double> v3;
}
Vector 와 같은 템플릿을 thin Template 이라고 부름(모바일 쪽 많이 사용)