#include using namespace boost::mpl; template < typename Enum > struct enum_size { static unsigned const size=0 //specializations should return //the actual value for given Enum. ; }; template < typename... Pairs > struct enums_offsets_pairs ; template < > struct enums_offsets_pairs<> { static unsigned const offset=0; }; template < typename Tag , typename Enum , typename... Pairs > struct enums_offsets_pairs < pair , Pairs... > : enums_offsets_pairs < Pairs... > { typedef enums_offsets_pairs < Pairs... > super_t; static unsigned const offset=enum_size::size+super_t::offset; }; template < typename... Pairs > struct enums_offsets ; template < typename... Tags , typename... Enums > struct enums_offsets < pair... > : enums_offsets_pairs < pair... > { }; enum E1{e11,e12,e13}; enum E2{e21,e22,e23}; struct T1; struct T2; template<>struct enum_size { static unsigned const size=1; }; template<>struct enum_size { static unsigned const size=2; }; typedef enums_offsets < pair , pair > eos; #include int main() { std::cout<