본문 바로가기
c++/template프로그래밍.

thintemplate

by kcj3054 2022. 5. 16.

thintemplate

  • thintemplate는 템플릿의 단점인 코드 메모리증가를 조금이나마 막기위한 방법입니다 필요없는 것을 base 클래스로 올리거나 아니면 모두 base클래스로 올리는 기법이다.

  • 사용하지 않는 것은 base로 올려서 사용하지않으면 코드 메모리를 방지할 수 있다.

소스

#include <iostream>

using namespace std;


class Base
{
protected:
    int sz;
public:
    int size() const;
    bool empty() const;
};

template<typename T> 
class Vector : public Base
{
    T* buff;
    //int sz;

public:
    //size랑 empty는 템플릿이 필요가 없는 환경이다. 부모로 올려도 상관없다.
    //int size() const;
    //bool empty() const;
    void push_front(const T& a) {}
    T& front() {}
};
int main()
{
    Vector<int> v1;
    Vector<double> v2;
    Vector<short> v3;


    return 0;
}
  • 위에서 템플릿 클래스에서 사용하지 않는 함수들은 기반 클래스 올리는 것이다..

소스2 (thin template)

#include <iostream>

using namespace std;


class Base
{
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 Base
{
    //T* buff;
    //int sz;

public:
    //size랑 empty는 템플릿이 필요가 없는 환경이다. 부모로 올려도 상관없다.
    //int size() const;
    //bool empty() const;
    inline void push_front(const T& a) { Base::push_front(static_cast<void*>(a); }
    inline T& front() { return static_cast<T&>Base::front(); }
};
int main()
{
    Vector<int> v1;
    Vector<double> v2;
    Vector<short> v3;


    return 0;
}
  • 모든것을 부모에 올리고 자식은 부모가 void*로 되어있어서 파생클래스는 캐스팅만 책임을 지면된다..