#include <iostream>
#include <vector>
using namespace std;
enum Enum
{
One =0, Two, Three
};
template<Enum> struct Map;
template<> struct Map<One>
{
using SysType = float;
};
template<> struct Map<Two>
{
using SysType = int;
};
template<> struct Map<Three>
{
using SysType = char;
};
template <Enum e> class A
{
private:
typename Map<e>::SysType element;
public:
typename Map<e>::SysType& GetElement()
{
return element;
}
};
template<Enum...e> class B
:
public A<e>...
{
public:
template <Enum type>
auto Get() -> typename Map<type>::SysType
{
return static_cast<A<type>*>(this)->GetElement();
}
};
class Element
{
Enum e;
size_t offset;
};
class C
{
public:
C(vector<Enum> es)
{
size_t size = 0;
for (size_t i = 0; i < es.size(); ++i)
{
offsetData.push_back(size);
size += GetSize(es[i]);
}
data.resize(size);
}
size_t GetSize(Enum e)
{
switch (e)
{
case One:
return sizeof(Map<One>::SysType);
case Two:
return sizeof(Map<Two>::SysType);
case Three:
return sizeof(Map<Three>::SysType);
}
}
template <Enum e>
auto Test() -> typename Map<e>::SysType&
{
using Dest = typename Map<e>::SysType;
return *(reinterpret_cast<Dest*>(data.data() + offsetData[e]));
}
size_t GetSize() { return data.size(); }
private:
vector<size_t> offsetData;
vector<char> data;
};
int main()
{
//B<One, Two> b;
C c({ One, Two, Three });
c.Test<One>() = 5.15f;
c.Test<Two>() = 10;
c.Test<Three>() = 'a';
cout << c.Test<One>() << endl; //5.15
cout << c.Test<Two>() << endl; //10
cout << c.Test<Three>() << endl; //a
}
클래스 다중 상속을 이용하여 Enum Type에 따라 클래스(구조체)를 생성하는 방법(1)과 char 배열을 Enum 타입에 따라 강제 형 변환(reinterpret_cast)하여 데이터를 저장하는 방법(2) 2가지를 만들어 보았다.
이는 Vertex 클래스를 동적으로 생성하기 위해 고안한 템플릿이다. Vertex의 데이터는 Position2D, 3D, ColorRGB, ColorRGBA, Tangent, TextureUV 등 여러가지 옵션에서 골라서 생성해야 하기 때문에, 각각 다른 구조체를 일일이 생성하는 것 보단 원하는 타입의 enum 을 통해 동적으로 데이터 크기를 조절하도록 일반화를 한 것이다.
'Programming' 카테고리의 다른 글
[C++] 비트 연산 활용 연습 (0) | 2020.01.30 |
---|---|
Template 상속 :: 부모의 변수 사용시 오류 (0) | 2020.01.25 |
Template 연구 - Enum과 Template 임의 다중 상속 (0) | 2020.01.21 |
Variadic Template :: arguments 분리하여 변수로 사용하기 (0) | 2020.01.20 |
[C++] 임의의 파라미터를 받는 Template 만들기(feat.std::make_unique) (0) | 2020.01.15 |