#include #include #include #include #include #include #include #include #include #include #include namespace fs = boost::fusion; namespace mpl = boost::mpl; using namespace std; template struct result_of_flatten; template::value> struct result_of_flatten_impl { typedef fs::iterator_range type; static inline type call(B const& b, P const&, E const& e) { return type(b, e); } }; template struct result_of_flatten_impl { typedef fs::iterator_range::type, E> rest_range; typedef result_of_flatten < typename fs::result_of::join < typename boost::remove_reference::type>::type , const rest_range >::type > result_of_flatten; typedef typename fs::result_of::join < const fs::iterator_range , const typename result_of_flatten::type >::type type; static inline type call(B const& b, P const& p, E const& e) { return fs::join ( fs::iterator_range(b, p) , result_of_flatten::call(fs::join(fs::deref(p), rest_range(fs::next(p), e))) ); } }; template struct result_of_flatten { typedef typename fs::result_of::begin::type begin; typedef typename fs::result_of::end::type end; typedef fs::traits::is_sequence pred; typedef typename fs::result_of::find_if::type pos_to_flatten; typedef result_of_flatten_impl impl; typedef typename impl::type type; static inline type call(Seq const& s) { return impl::call(fs::begin(s), fs::find_if(s), fs::end(s)); } }; //////////////////////////// template inline typename result_of_flatten::type flatten(Seq const& seq) { return result_of_flatten::call(seq); } int main(int argc, char *argv[]) { cout << flatten(fs::make_vector(fs::make_vector(10, 11, fs::make_vector(12, 13)), fs::make_vector(14), 15)) << endl; system("PAUSE"); return EXIT_SUCCESS; }