$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: David Abrahams (dave_at_[hidden])
Date: 2005-10-13 10:42:14
Simon Buchan <simon_at_[hidden]> writes:
> David Abrahams wrote:
>> Lewis Hyatt <lhyatt_at_[hidden]> 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