
Larry Evans wrote:
In extension.htm, there's a section:
Designing a suitable iterator
which has code:
template<typename Struct, int Pos> struct example_struct_iterator : iterator_base<example_struct_iterator<Struct, Pos> > { BOOST_STATIC_ASSERT(Pos >=0 && Pos < 3); typedef Struct struct_type; typedef mpl::int_<Pos> index; typedef example_struct_iterator_tag ftag; typedef random_access_traversal_tag category;
example_struct_iterator(Struct& str) : struct_(str) {}
Struct& struct_; };
However, there's no declaration of example_struct_iterator_tag. I assume it can just be declared (no need to define it) like the example_sequence_tag occuring just below the section titled:
There's going to be a couple of changes in this example. You are correct though that a forward declaration of example_struct_iterator_tag is needed, if only to make the docs clearer.
Enabling Tag Dispatching
Actually, I think that's another typo, IOW instead of example_sequence_tag, it should be example_tag. But that makes me wonder if you didn't meand that example_struct_iterator_tag should also be example_tag.
The correct structure should be that the tag_of the example_struct should be example_sequence_tag, and the tag_of the iterator should be example_struct_iterator_tag. (There should be 2 distinct tags). This should be tidied up and consistent in the next version of the docs.
Also, since the above code is all for a specific structure, i.e. example_struct, why is there any need for including a Struct template parameter. Why not just:
template<int Pos> struct example_struct_iterator : iterator_base<example_struct_iterator<example_struct, Pos> > { BOOST_STATIC_ASSERT(Pos >=0 && Pos < 3); typedef example_struct struct_type; ... };
The Struct parameter allows us to capture whether the iterator points into an example_struct or a const example_struct. Some of the rest of the example code needs to make this distinction. Thanks for the feedback Cheers Dan