#include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include namespace fusion=boost::fusion; namespace mpl=boost::mpl; struct deref_data { template struct result; template struct result { typedef typename boost::remove_reference::type pair; typedef typename boost::add_reference< typename mpl::eval_if< boost::is_const, boost::add_const, mpl::identity >::type >::type type; }; template typename result::type operator()(Pair& p)const { return p.second; } template typename result::type operator()(Pair const& p)const { return p.second; } }; template struct distance_to_beg: fusion::result_of::distance< typename fusion::result_of::begin::type, typename fusion::result_of::find::type > {}; template F for_each(Range& range, F f) { typedef typename boost::range_value::type range_value; typedef typename boost::range_reference::type range_reference; typedef fusion::nview< typename boost::remove_reference::type, typename mpl::fold< Keys, mpl::vector_c, mpl::push_back< mpl::_1, distance_to_beg > >::type > reordered; BOOST_FOREACH(range_reference v, range) { fusion::at_key(v)= fusion::invoke(f, fusion::transform(reordered(v),deref_data())); } return f; } int test_f(void*, double) { return 123; } int main() { typedef fusion::map,fusion::pair,fusion::pair > map; std::vector v; v.push_back(map(0,0,0)); for_each >(v,test_f); std::cout << fusion::at_key(v.front()) << std::endl; return fusion::at_key(v.front())!=123; }