Hello meta programmers, I am looking for a way to extract a sub sequence of a given type list by identifying the begin/end of the sub sequence by the corresponding iterators <code> #include <boost/mpl/vector.hpp> #include <boost/mpl/for_each.hpp> #include <boost/mpl/less.hpp> #include <boost/mpl/greater.hpp> #include <boost/mpl/and.hpp> #include <boost/mpl/find.hpp> #include <boost/mpl/lambda_fwd.hpp> #include <boost/mpl/lambda.hpp> #include <boost/mpl/placeholders.hpp> #include <boost/mpl/if.hpp> #include <boost/mpl/copy.hpp> #include <boost/mpl/copy_if.hpp> #include <boost/mpl/remove_if.hpp> #include <boost/mpl/back_inserter.hpp> #include <boost/mpl/transform.hpp> #include <boost/mpl/push_back.hpp> #include <boost/mpl/int.hpp> // these namespace clauses are motivated from "C++ Template Metaprogramming" by D.Abrahams,A.Gurtovoy: namespace mpl = boost::mpl ; using mpl::placeholders; // But why do I still need to type 'mpl::_1' instead of plain '_1' ? // here is my type list typedef mpl::vector<int,double,std::string > my_types; // from_pos and to_pos are start and end iterators of the subsequence typedef typename mpl::find<my_types,int>::type from_pos; typedef typename mpl::find<my_types,std::string>::type to_pos; // all elements (types) of my_types should be copied into the new seuqence my_sub_types if their iterator (index) is inside the given interval (from_pos,to_pos) typedef mpl::copy_if<my_types, mpl::and_< mpl::greater< mpl::find<my_types,mpl::_1>::type, mpl::int_<from_pos> > , mpl::less< mpl::find<my_types,mpl::_1>::type, mpl::int_<to_pos> >
, mpl::back_inserter< mpl::vector<> > ::type my_sub_types;
</code> This code (and lots of slight variations) does not compile. Why ? Any hint (conceptual,syntactical,etc.) is welcome ! regards,Martin. <martin@pasdzierny.de>
"Martin Pasdzierny" <martin@pasdzierny.de> wrote [...]
// here is my type list typedef mpl::vector<int,double,std::string > my_types;
// from_pos and to_pos are start and end iterators of the subsequence typedef typename mpl::find<my_types,int>::type from_pos; typedef typename mpl::find<my_types,std::string>::type to_pos;
// all elements (types) of my_types should be copied into the new seuqence my_sub_types if their iterator (index) is inside the given interval (from_pos,to_pos) typedef mpl::copy_if<my_types, mpl::and_< mpl::greater< mpl::find<my_types,mpl::_1>::type, mpl::int_<from_pos> > , mpl::less< mpl::find<my_types,mpl::_1>::type, mpl::int_<to_pos> >
, mpl::back_inserter< mpl::vector<> > ::type my_sub_types;
</code>
This code (and lots of slight variations) does not compile. Why ?
Most likely because mpl::greater, etc., are defined to work with integral constants, not with iterators. I think you should just use iterator_range: typedef mpl::iterator_range<from_pos, to_pos>::type my_sub_types; HTH, Arkadiy
participants (2)
-
Arkadiy Vertleyb
-
Martin Pasdzierny