#include template< typename... > struct TypeList { using Empty = wibble::Unit; static constexpr size_t length = 0; }; template< typename _T, typename... _Ts > struct TypeList< _T, _Ts... > : private TypeList< _Ts... > { using Head = _T; using Tail = TypeList< _Ts... >; static constexpr size_t length = 1 + Tail::length; };