#ifndef __TYPELIST_H #define __TYPELIST_H class NullType {}; template< class T, class U > struct TypeList { typedef T Head; typedef U Tail; }; #define TYPELIST_1( T1 ) TypeList< T1, NullType > #define TYPELIST_2( T1, T2 ) TypeList< T1, TYPELIST_1( T2 ) > #define TYPELIST_3( T1, T2, T3 ) TypeList< T1, TYPELIST_2( T2, T3 ) > #define TYPELIST_4( T1, T2, T3, T4 ) TypeList< T1, TYPELIST_3( T2, T3, T4 ) > template< class T> struct Length; template< > struct Length< NullType > { enum { value = 0 }; }; template< class T, class U > struct Length< TypeList< T, U > > { enum { value = 1 + Length< U >::value }; }; #endif