|
Boost : |
From: David Abrahams (dave_at_[hidden])
Date: 2004-05-21 10:47:49
"Reece Dunn" <msclrhd_at_[hidden]> writes:
> I reported that VC7 uses the correct implementation of
> reverse_iterator, and that this can be detected via
> BOOST_NO_STD_ITERATOR. Although this compiles, you cannot use reverse
> iterators.
Just use boost::reverse_iterator instead. It works better anyway.
> The problem is that the iterator is of the form (const) T *, and this
> fails because there is not a correct implementation of iterator_traits
> (due to a lack of partial template specialization) that *is* detected
> by BOOST_NO_STD_ITERATOR_TRAITS.
Just use boost::detail::iterator_traits instead (from
boost/detail/iterator.hpp); it works better anyway.
> The solution would therefore be to - in this case - provide an
> iterator wrapper around a standard pointer so it has the correct
> Iter::value_type, etc definitions.
Ick.
> Is there an iterator_adaptor that provides this within boost? If
> not, should there be one? I am looking into this and will commit the
> solution to my iterator_adaptor-style implementation
> (sandbox/boost/fixed_string/detail/basic_string_impl.hpp).
Sounds like a hard way to go, but it's easy to build.
// untested
template <class T>
struct non_pointer_iterator
: iterator_adaptor<non_pointer_iterator<T>, T>
{
typedef iterator_adaptor<non_pointer_iterator<T>, T> super;
non_pointer_iterator() {}
non_pointer_iterator(T x) : super(x) {}
template <class U>
node_iter(
non_pointer_iterator<U> const& other
, typename boost::enable_if<
boost::is_convertible<U,T>
, char
>::type = 0
)
: super_t(other.base()) {}
};
-- Dave Abrahams Boost Consulting http://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