.. Version 1.3 of this document was accepted for TR1 :: template class transform_iterator { public: typedef /* see below */ value_type; typedef /* see below */ reference; typedef /* see below */ pointer; typedef iterator_traits::difference_type difference_type; typedef /* see below */ iterator_category; transform_iterator(); transform_iterator(Iterator const& x, UnaryFunction f); template transform_iterator( transform_iterator const& t , typename enable_if_convertible::type* = 0 // exposition only , typename enable_if_convertible::type* = 0 // exposition only ); Iterator base() const; UnaryFunction functor() const; reference operator*() const; transform_iterator& operator++(); transform_iterator& operator--(); private: Iterator m_iterator; // exposition only UnaryFunction m_f; // exposition only }; The ``reference`` type of ``transform_iterator`` is ``result_of::reference)>::type``. The ``value_type`` is ``remove_cv >::type``. The ``iterator_category`` member is a type convertible to the iterator tag given by the following algorithm. Let ``C`` be ``traveral_category::type``. :: if (reference is a reference to value_type) then if (C is convertible to random_access_traversal_tag) then random_access_iterator_tag else if (C is convertible to bidirectional_traversal_tag) then bidirectional_iterator_tag else forward_iterator_tag else input_iterator_tag ``transform_iterator`` requirements ................................... The type ``UnaryFunction`` must be Assignable, Copy Constructible, and the expression ``f(*i)`` must be valid where ``f`` is an object of type ``UnaryFunction``, ``i`` is an object of type ``Iterator``, and where the type of ``f(*i)`` must be ``result_of::reference)>::type``. The argument ``Iterator`` shall model Readable Iterator. ``transform_iterator`` models ............................. The resulting ``transform_iterator`` models the most refined of the following options that is also modeled by ``Iterator``. * Writable Lvalue Iterator if ``transform_iterator::reference`` is a non-const reference. * Readable Lvalue Iterator if ``transform_iterator::reference`` is a const reference. * Readable Iterator otherwise. The ``transform_iterator`` models the most refined standard traversal concept that is modeled by the ``Iterator`` argument. If ``transform_iterator`` is a model of Readable Lvalue Iterator then it models the following original iterator concepts depending on what the ``Iterator`` argument models. +-----------------------------------+---------------------------------+ | If ``Iterator`` models | then ``filter_iterator`` models | +===================================+=================================+ | Single Pass Iterator | Input Iterator | +-----------------------------------+---------------------------------+ | Forward Traversal Iterator | Forward Iterator | +-----------------------------------+---------------------------------+ | Bidirectional Traversal Iterator | Bidirectional Iterator | +-----------------------------------+---------------------------------+ | Random Access Traversal Iterator | Random Access Iterator | +-----------------------------------+---------------------------------+ If ``transform_iterator`` models Writable Lvalue Iterator then it is a mutable iterator (as defined in the old iterator requirements). ``transform_iterator`` operations ................................. In addition to the operations required by the concepts modeled by ``transform_iterator``, ``transform_iterator`` provides the following operations. ``transform_iterator();`` :Returns: An instance of ``transform_iterator`` with ``m_f`` and ``m_iterator`` default constructed. ``transform_iterator(Iterator const& x, UnaryFunction f);`` :Returns: An instance of ``transform_iterator`` with ``m_f`` initialized to ``f`` and ``m_iterator`` initialized to ``x``. :: template transform_iterator( transform_iterator const& t , typename enable_if_convertible::type* = 0 // exposition ); :Returns: An instance of ``transform_iterator`` that is a copy of ``t``. :Requires: ``OtherIterator`` is implicitly convertible to ``Iterator``. ``Iterator base() const;`` :Returns: ``m_iterator`` ``UnaryFunction functor() const;`` :Returns: ``m_f`` ``reference operator*() const;`` :Returns: ``m_f(*m_iterator)`` ``transform_iterator& operator++();`` :Effects: ``++m_iterator`` :Returns: ``*this`` ``transform_iterator& operator--();`` :Effects: ``--m_iterator`` :Returns: ``*this``