
David Abrahams wrote: [snip]
This instantiates the template on the cdr with N-1 iterations i.e., it's like advance(++x, n-1) You need ++advance(x, n-1) to avoid O(N^2)
> element;
Nifty! I implemented this in fusion. Pretty straightforward (yeah, I'm using partial specialization): template <typename Cons> struct cons_deref { typedef typename Cons::car_type type; }; template <typename Cons, int I> struct cons_advance { typedef typename cons_advance<Cons, I-1>::type::cdr_type type; }; template <typename Cons> struct cons_advance<Cons, 0> { typedef Cons type; }; Then: template <> struct at_impl<cons_tag> { template <typename Sequence, typename N> struct apply { typedef detail::cons_deref< typename cons_advance<Sequence, N::value>::type> element; ... }; As an added bonus, I unrolled advance for up to N==5. Thanks for the tips, Dave, Steven! Regards, -- Joel de Guzman http://www.boostpro.com http://spirit.sf.net