David Abrahams wrote:

> >> I have a problem while using the iterator_adaptor templates
> >> in conjunction with a istreambuf_iterator<char> (an 
> >> input_iterator type). The problem shows up, because the 
> >> istreambuf_iterator<char>::operator*()
> >> implementation of the STL I'm using returns a value_type 
> >> (char), but the dereference policy member expects to return 
> >> it a reference.
> >> 
> >> It seems, that there should be a similar return type deduction for 
> >> the
> >> iterator_adaptor<>::operator*() function as already 
> >> implemented for the
> >> iterator_adaptor<>::operator->() function.
> >
> > Regards Hartmut
> 
> Which template are you having problems with?  Can you post 
> some code which reproduces the problem?  Did you try 
> explicitly specifying the iterator's reference type?

I've attached a minimal (braindead) sample, which reproduces the problem
(it does not compile). 

The input_iterator used as the Base iterator of the adaptor returns a
value_type from its operator*(), but the iterator_adaptor template
expects a reference here. Surely I could solve it by adding a member of
type value_type to my policy class, using it as a buffer and the
reference to it may be returned, but isn't it better to resolve it in
the adaptor? Even more because a congruent problem, which happens often
with the operator->() is already solved through a proxy class. I believe
that the operator*() problem may be solved in a similar fashion.

Regards Hartmut
#include <iterator>
#include <boost/iterator_adaptors.hpp>

using namespace boost;

struct dummy_input_iterator 
{
    typedef std::input_iterator_tag iterator_category;
        typedef char value_type;
        typedef size_t difference_type;
        typedef char * pointer;
        typedef char & reference;
        
        value_type operator*() const { return 42; }
        dummy_input_iterator & operator++() { return *this; }
        dummy_input_iterator operator++(int) { return *this; }
};

typedef iterator_adaptor<
        dummy_input_iterator, default_iterator_policies,
        char, char &, char *
    > adapted_dummy_iterator;
    
void main()
{
adapted_dummy_iterator it, end;
char c;

    while (it != end) {
        c = *it;
        ++it;
    }
}

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to