Linearizing type list creation without macros

Form Alexandrescu "Modern C++...", a type list is defined as template<class T, class U> struct TL { typedef T head; typedef U tail; }; A lot of interesting stuff can be made with, please refer to the book for reference. A problem is the initialization, as the author says: "A Plethora of macros that transform recursion into simple enumeration..." Something like: #define TL_1(a) TL<a, NullType > #define TL_2(a,b) TL<a, TL_1(b) > #define TL_3(a,b,c) TL<a, TL_2(b,c) > #define TL_4(a,b,c,d) TL<a, TL_3(b,c,d) > #define TL_5(a,b,c,d,e) TL<a, TL_4(b,c,d,e) > #define TL_6(a,b,c,d,e,f) TL<a, TL_5(b,c,d,e,f) > So that it is possible to say: TL_3(int, double, char*) and get the corresponding type list. I think it is possible to avoid the macros: struct E {}; template<class T1 = E, class T2 = E, class T3 = E, class T4 = E, class T5 = E, class T6 = E, class T7 = E> struct TLCreator { typedef TL<T1, typename TLCreator<T2,T3,T4,T5,T6,T7,E>::MyTL> MyTL; }; template<> struct TLCreator<E, E, E, E, E, E, E> { typedef E MyTL; }; Now you can say: TLCreator<int, double, char*>::MyTL instead of using a macro. Following little drivers shows it works. First define a type list length calculator, as explained by Alexandrescu: /* type list length */ template<class TL> struct Length; template<> struct Length<E> { enum{ value = 0 }; }; template<class T, class U> struct Length<TL<T,U> > { enum{ value = 1 + Length<U>::value }; }; Then test putting in main() the following int m1 = Length< TLCreator<int>::MyTL >::value; int m2 = Length< TLCreator<int, double>::MyTL >::value; int m3 = Length< TLCreator<int, double, std::string>::MyTL >::value; int m4 = Length< TLCreator<int, double, std::string, char>::MyTL >::value; std::cout << "\n" << m1 << ", " << m2 << ", " << m3 << ", " << m4 << "\n"; And you get what you would expect! I don't know if this is a known result. But it seems very powerful, indeed you can do a lot of things following the previous schema. If it is not already known I can post more example of the use of the above "template parameters iteration" schema. Thanks for your attention Marco

Marco Costalba wrote:
I think it is possible to avoid the macros:
It is. See http://www.boost.org/libs/mpl/doc/refmanual/list.html for what's already in Boost. There aren't many tricks not used in the MPL. Furthermore, it is possible to use macros to generate the templates and specializations necessary for this trick. See the MPL sources and the PP library if this interests you. Sebastian Redl

On 09/01/07 11:44, Sebastian Redl wrote:
Marco Costalba wrote:
I think it is possible to avoid the macros:
It is. See http://www.boost.org/libs/mpl/doc/refmanual/list.html for what's already in Boost. There aren't many tricks not used in the MPL. Furthermore, it is possible to use macros to generate the templates and specializations necessary for this trick. See the MPL sources and the PP library if this interests you.
Sebastian Redl Doug Gregor's variadic template compiler can be used to do this without any macros (mpl uses the boost_pp library). There is a partial translation of mpl to use this compiler in the boost vault under variadic_templates.
participants (3)
-
Larry Evans
-
Marco Costalba
-
Sebastian Redl