"Duane Murphy"
--- At Tue, 4 Jun 2002 00:05:46 -0400, David Abrahams wrote:
The canonical example is a file iterator; iterate over the files in a directory. The directory appears to be a container with filenames as the members of the container.
What would the base and policy objects be?
The way I have been doing it would be to first use the default_iterator_policies. That's because I basically want a default iterator.
You have a misapprehension about the meaning of "default" here. In no sense is it intended to create "default iterators" (whatever that is). Probably default_iterator_policies is misnamed, and should be called "passthrough_iterator_policies" or something. In general, default_iterator_policies is meant to be used as a base class for other policies, because it provides useful default policy behaviors.
I dont have any iterator to assign policies to yet.
The policies are supposed to implement the core operations of the iterator using the Base object. You can, of course, stick the neccessary functionality in the Base object and use the default policies, as you are doing, but it seems a little unnatural to me.
Next I define the simplest iterator required by the default_iterator_policies.
Please, don't say that! default_iterator_policies doesn't require an iterator, and if you define the simplest Base object required, you're not defining an iterator. Witness counting_iterator_adaptor, which can accept an integer as a Base object.
This is usually a forward iterator if copying is practical given the nature of the API. Basically in the example, the iterator would hold a DIR structure and use the standard DIR APIs to "increment" and dereference the structure as required.
So, what is the "normal" way of creating an iterator out of thin air as it were?
If you have a DIR structure, I would use that as the Base object directly, then write a Policies class which implements the operations on it. -Dave