#include <iostream>
using namespace std;
enum Enum
{
One, Two,
};
template<Enum> struct Map;
template<> struct Map<One>
{
using SysType = int;
};
template<> struct Map<Two>
{
using SysType = double;
};
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();
}
};
int main()
{
B<One, Two> b;
cout << sizeof(b.Get<One>()); // 4(int)
cout << sizeof(b.Get<Two>()); // 8(double)
}
신기한 점 : Map 앞에 typename을 붙여줘야 동작하더라. 그리고 중요한 점.
b의 크기는 int(4) + double(8) 이므로 12바이트가 될 거라고 생각했는데, 16이 되었다. 8바이트씩 증가하는 형태였다.
char, int 등으로 바꿔가면서 실험을 해본 결과, 가장 큰 데이터 크기에 맞춰서 확장이 되는 형태였다. 상속받는 중에 int 나 float이 가장 큰 데이터 크기라면 상속받은 클래스는 가장 큰 데이터 * 다중 상속받은 클래스 수 만큼의 크기를 갖는다.
#include <iostream>
using namespace std;
enum Enum
{
One, Two, Three
};
template<Enum> struct Map;
template<> struct Map<One>
{
using SysType = char;
};
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();
}
};
int main()
{
B<One, Two> b;
cout << sizeof(b.Get<One>()) << endl; // 4(int)
cout << sizeof(b.Get<Two>()) << endl; // 8(double)
cout << sizeof(B<One,Two,Three>) << endl; //4 + 4 + 4 (char + int + char 지만 int에 맞춰서 모두 4바이트가 되어버림
}'Programming' 카테고리의 다른 글
| Template 상속 :: 부모의 변수 사용시 오류 (0) | 2020.01.25 |
|---|---|
| Enum Template 응용 :: 강제 형 변환하여 char 데이터 배열을 원하는 타입으로 출력 (0) | 2020.01.22 |
| Variadic Template :: arguments 분리하여 변수로 사용하기 (1) | 2020.01.20 |
| [C++] 임의의 파라미터를 받는 Template 만들기(feat.std::make_unique) (0) | 2020.01.15 |
| [C++] std::unordered_map // std::unordered_multimap (0) | 2020.01.15 |