|
Boost : |
From: David Abrahams (dave_at_[hidden])
Date: 2004-02-23 07:08:26
Gabriel Dos Reis <gdr_at_[hidden]> writes:
> David Abrahams <dave_at_[hidden]> writes:
>
> | Daniel Frey <daniel.frey_at_[hidden]> writes:
> |
> | > Consider:
> | >
> | > // A strange way to retrieve my_container.begin():
> | > boost::prior( my_container.end(), my_container.size() );
> | >
> | > Is that legal? The second template parameter of boost::prior is
> | > deduced to an unsigned(!) type, which IMHO means that -n is undefined,
> | > right? Do we need to fix this? Maybe:
> | >
> | > template <class T>
> | > T prior(T x, typename T::difference_type n)
> | > {
> | > std::advance(x, -n);
> | > return x;
> | > }
> |
> | Well, that wouldn't work!
> | How would you call prior(p, 4) when p is int*?
>
> I suppose he wanted to say
>
> template<class T>
> T prior(T x, typename std::iterator_traits<T>::different_type n)
>
> ?
>
> | > or shall we document that it's illegal/undefined to call
> | > boost::prior() with an unsigned second parameter?
> |
> | Hmm, no I think if it's unsigned we should either deduce an
> | appropriate signed type or implement the "backward advance"
> | ourselves. We could use reverse_iterator to do that, FWIW.
>
> That would be an isomorphic implementation, indeed.
>
Hey! These implementations using "advance" don't work for
non-iterators (e.g. int) the way regular next() and prior() do. I
consider this a bug!
-- Dave Abrahams Boost Consulting www.boost-consulting.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk