
Neal D. Becker wrote:
Thanks for the advice. I think I have it now.
Problem:
A function F accepts a pair of stl-style iterators as input. A nullary functor G can generate an output. Arrange for F to call G n times without storing to an intermediate sequence.
Example: G is a random number generator.
I wonder if there is a more elegant approach?
I have a couple of questions 1. Is this really forward_traversal_iterator? E.g. if your function extracts data from stream, then you can't store copies of iterators and make a second pass over the data. 2. Why did you declared 'advance'. IIRC, this is not required from forward iterators. As for improving this, I also have two ideas: 1. Some time ago I've created an utility class for creating input iterators, called "eof_iterator". Reimplementing function_input_iterator with it yeilds somewhat smaller code, see: http://zigzag.cs.msu.su:7813/iterators/function_input_iterator2.hpp the eof iterator itself is at: http://zigzag.cs.msu.su:7813/iterators/eof_iterator.hpp There are some drawbacks, though: the size of iterator will be bigger. 2. It's possible to create iterator which just calls functional object (without counting). As separate "until_iterator" would take any iterator and a functional object and iterate until the functional object returns true. So, your iterator will be implemented like: typedef function_input_iterator<SomeFunc> it; class CountTo { ... }; typedef until_iterator<it, CountTo> uit; copy(uit(it(some_func), CountTo(10)), uit(), ........) I actually believe that such until_iterator can be rather usefull sometimes. - Volodya