|
Boost Users : |
From: David Abrahams (dave_at_[hidden])
Date: 2004-01-06 09:59:17
"Keith MacDonald" <boost_at_[hidden]> writes:
> You have proposed a very elegant solution, but I would defy anyone who does
> not understand the library inside out to arrive at that solution. The
> documentation (iterator/doc/index.html#iterator-facade-and-adaptor) states:
We're working on the docs. That document is the standards proposal,
but the Boost (user-level) docs aren't complete yet.
> "It is common to define a new iterator which behaves like another iterator,
> but which modifies some aspect of its behavior. For that purpose, the
> library supplies the iterator_adaptor class template, which is specially
> designed to take advantage of as much of the underlying iterator's behavior
> as possible."
>
> In this case, I can't see what the underlying iterator is, so don't
> understand how iteration can proceed.
I quote:
The iterator_adaptor class template adapts some Base 3 type to
create a new iterator. Instantiations of iterator_adaptor are
derived from a corresponding instantiation of iterator_facade and
implement the core behaviors in terms of the Base type. In essence,
iterator_adaptor merely forwards all operations to an instance of
the Base type, which it stores as a member.
[3] The term "Base" here does not refer to a base class and is not
meant to imply the use of derivation. We have followed the lead of
the standard library, which provides a base() function to access the
underlying iterator object of a reverse_iterator adaptor.
The user of iterator_adaptor creates a class derived from an
instantiation of iterator_adaptor and then selectively redefines
some of the core member functions described in the table above. The
Base type need not meet the full requirements for an iterator. It
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
need only support the operations used by the core interface
functions of iterator_adaptor that have not been redefined in the
user's derived class.
> For example, if you add the statement
> "++x;" to your example, it fails to compile.
Umm, sorry. I whipped that one off without too much testing. I've
enclosed a fixed one.
> To return to my point about the purpose of a software library, my
> approach is generally to ask if it will allow me to implement code
> more quickly and reliably than without it. I got to the point of
> thinking, I've now got to implement a straightforward iterator,
> sigh, so will the boost library help me? I didn't expect to have to
> develop a deep understanding of template metaprogramming and the
> curiously recurring template pattern, before I could move on.
Why would you need to develop either of those? You just follow the
formula.
> Hence my plea for an example of a plain vanilla iterator, by which
> I meant something similar to those used for the std library
> containers.
I'm sorry, I need you to be more specific. Is the example of your
node iterator good enough?
-- Dave Abrahams Boost Consulting www.boost-consulting.com
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net