
Simon Buchan <simon@hand-multimedia.co.nz> writes:
David Abrahams wrote:
Lewis Hyatt <lhyatt@Princeton.EDU> writes:
The idea is to define a template class,
template<typename Iterator> class first_iterator_t { Iterator pair_iter; public: first_iterator_t(Iterator const&); /*...*/ };
which overloads operator*() and operator->() to access the element named "first" of the object returned by Iterator::operator*(). (With something analagous for second_iterator_t.) A function named first_iterator() provides a convenient creation function a-la std::make_pair().
Sounds like a job for transform_iterator.
http://www.boost.org/libs/iterator/doc/transform_iterator.html
transform_iterator<(&_1)->first, Iterator>?
Not quite; an expression like that never matches a type template parameter. struct get_first { template <class T> typename T::first_type& operator()(T& x) const { return x.first; } template <class T> typename T::first_type const& operator()(T const& x) const { return x.first; } }; // similar get_second transform_iterator<get_first, Iterator>
Interesting, it could save me a couple of lines here and there... (every little bit helps)
Considering that most user-defined "iterators" are actually wrong for reasons described in http://www.boost.org/libs/iterator/doc/facade-and-adaptor.html#motivation, it could save you more than that. :) -- Dave Abrahams Boost Consulting www.boost-consulting.com