
David Abrahams wrote:
Wow, looking at the tuples code it seems there's a lot of optimization we can do now!
So... deref(advance(begin(tuple)), n) where advance is implemented as iterator advance(iterator x, int n) { if (n == 0) return x; else return ++advance(x, n - 1); // corrected } Isn't this what we are already doing in fusion? template <> struct at_impl<cons_tag> { template <typename Sequence, typename N> struct apply { typedef typename mpl::eval_if< is_const<Sequence> , add_const<typename Sequence::cdr_type> , mpl::identity<typename Sequence::cdr_type> >::type cdr_type; typedef typename mpl::eval_if< mpl::bool_<N::value == 0> , mpl::identity<typename Sequence::car_type> , apply<cdr_type, mpl::int_<N::value-1> > > element; typedef typename mpl::eval_if< is_const<Sequence> , detail::cref_result<element> , detail::ref_result<element> >::type type; template <typename Cons, int N2> static type call(Cons& s, mpl::int_<N2>) { return call(s.cdr, mpl::int_<N2-1>()); } template <typename Cons> static type call(Cons& s, mpl::int_<0>) { return s.car; } static type call(Sequence& s) { return call(s, mpl::int_<N::value>()); } }; }; Regards, -- Joel de Guzman http://www.boostpro.com http://spirit.sf.net