The typelist _ ** macro in Loki is too difficult to use because it cannot support variable parameters.
Based on the idea of tuple in boost, this typelist_maker is implemented:
Template <class T1 = nulltype, class t2 = nulltype, class T3 = nulltype, class T4 = nulltype, class T5 = nulltype,
Class T6 = nulltype, class T7 = nulltype, class T8 = nulltype, class T9 = nulltype, class t10 = nulltype,
Class T11 = nulltype, class T12 = nulltype, class t13 = nulltype, class T14 = nulltype, class T15 = nulltype,
Class T16 = nulltype, class t17 = nulltype, class T18 = nulltype, class t19 = nulltype, class T20 = nulltype,
Class T21 = nulltype, class T22 = nulltype, class T23 = nulltype, class T24 = nulltype, class t25 = nulltype,
Class t26 = nulltype, class t27 = nulltype, class t28 = nulltype, class t29 = nulltype, class T30 = nulltype,
Class t31 = nulltype, class T32 = nulltype, class t33 = nulltype, class t34 = nulltype, class t35 = nulltype,
Class t36 = nulltype, class t37 = nulltype, class t38 = nulltype, class t39 = nulltype, class T40 = nulltype,
Class t41 = nulltype, class t42 = nulltype, class T43 = nulltype, class T44 = nulltype, class T45 = nulltype,
Class t46 = nulltype, class t47 = nulltype, class t48 = nulltype, class t49 = nulltype, class T50 = nulltype>
Struct typelist_maker
{
PRIVATE:
Typedef typelist_50 (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
T11, T12, t13, T14, T15, T16, t17, T18, t19, T20,
T21, T22, T23, T24, t25, t26, t27, t28, t29, T30,
T31, T32, t33, t34, t35, t36, t37, t38, t39, T40,
T41, t42, T43, T44, T45, t46, t47, t48, t49, t50) tmplist;
Public:
Typedef typename eraseall <tmplist, nulltype>: Result result;
};
Now, the world will be much more clean.
Then a small extension is maxsizeof, which takes the maximum size of a group of types.
The traditional method uses Union, and of course it is uncomfortable.
Template <class tlist>
Struct maxsizeof;
Template <>
Struct maxsizeof <nulltype>
{
Enum {value = 0 };
};
Template <class head, class tail>
Struct maxsizeof <typelist {
PRIVATE:
Enum {maxsizeoftail = maxsizeof <tail >:: value };
Public:
Enum {value = (sizeof (head)> maxsizeoftail? Sizeof (head): maxsizeoftail )};
};