leesangwon0114

I am Research Engineer. Currently working in KT.

C++Template 22. TemplateDesign_thin template

28 Aug 2018 » c++

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 이라고 부름(모바일 쪽 많이 사용)