#include #include #include #include #include #include #include #include #include #include #include #include namespace detail { template struct add_pair_size { typedef boost::fusion::pair type; }; template struct types_to_size_type { typedef typename boost::mpl::transform< TTypes, add_pair_size, boost::mpl::back_inserter > >::type size_seq; typedef typename boost::fusion::result_of::as_map::type type; }; template struct copy_size { copy_size(const TSize0& size0, TSize1& size1) : _size0(size0), _size1(size1) {} typedef void result_type; template void operator()(TIndex) const { typedef typename boost::mpl::at::type Type0; typedef typename boost::mpl::at::type Type1; boost::fusion::at_key(_size1) = boost::fusion::at_key(_size0); } private: const TSize0& _size0; TSize1& _size1; }; } // namespace detail int main() { typedef boost::mpl::vector Types0; typedef boost::mpl::vector Types1; typedef boost::mpl::zip_view > ZippedTypes; typedef boost::mpl::copy > >::type ZippedTypesVector; typedef detail::types_to_size_type::type Size0; Size0 size0; typedef detail::types_to_size_type::type Size1; Size1 size1; typedef detail::types_to_size_type::type ZippedSizeType; ZippedSizeType zippedSize; typedef boost::mpl::range_c::type::value> IndexRange; boost::mpl::for_each(detail::copy_size(size0, zippedSize)); }