POD:
union AllDerived {
Derived0 _0;
Derived1 _1;
Derived2 _2;
};
static const size_t LARGEST_CHILD_SIZE = sizeof(AllDerived);
static const size_t NUMBER_OF_POOLS = 10;
char buffer[NUMBER_OF_POOLS * LARGEST_CHILD_SIZE];
POD:
template <int Value1, int Value2>
struct static_max {
static const int value = (Value1 < Value2) ? Value2 : Value1 ;
};
template<typename T, typename U>
struct TypeList {
typedef T Head;
typedef U Tail;
};
class NullType {};
template
<
typename T1 = NullType, typename T2 = NullType, typename T3 = NullType,
typename T4 = NullType, typename T5 = NullType, typename T6 = NullType,
typename T7 = NullType, typename T8 = NullType, typename T9 = NullType,
typename T10 = NullType, typename T11 = NullType, typename T12 = NullType,
typename T13 = NullType, typename T14 = NullType, typename T15 = NullType,
typename T16 = NullType, typename T17 = NullType, typename T18 = NullType
>
struct MakeTypelist
{
private:
typedef typename MakeTypelist
<
T2 , T3 , T4 ,
T5 , T6 , T7 ,
T8 , T9 , T10,
T11, T12, T13,
T14, T15, T16,
T17, T18
>
::Result TailResult;
public:
typedef TypeList<T1, TailResult> Result;
};
template<>
struct MakeTypelist<>
{
typedef NullType Result;
};
template<typename TList>
struct MaxTypeSize;
template <>
struct MaxTypeSize<NullType> {
enum { value=0 };
};
template<typename T, typename U>
struct MaxTypeSize<TypeList<T,U>> {
enum { value = static_max<sizeof(T), MaxTypeSize<U>::value>::value };
};
typedef MakeTypelist<Derived0, Derived1, Derived2>::Result AllTypes;
static const size_t LARGEST_CHILD_SIZE = MaxTypeSize<AllTypes>::value;
static const size_t NUMBER_OF_POOLS = 10;
char buffer[NUMBER_OF_POOLS * LARGEST_CHILD_SIZE];
type list compile-type max. Loki. MaxTypeSize .