template <
    class Derived
  , class Base
  , class Value               = use_default
  , class CategoryOrTraversal = use_default
  , class Reference           = use_default
  , class Difference = use_default
>
class iterator_adaptor 
  : public iterator_facade<Derived, V', C', R', D'> // see details
{
    friend class iterator_core_access;
 public:
    iterator_adaptor();
    explicit iterator_adaptor(Base iter);
    Base const& base() const;
 protected:
    typedef iterator_adaptor iterator_adaptor_;
    Base const& base_reference() const;
    Base& base_reference();
 private: // Core iterator interface for iterator_facade.  
    typename iterator_adaptor::reference dereference() const;

    template <
    class OtherDerived, class OtherIterator, class V, class C, class R, class D
    >   
    bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;

    void advance(typename iterator_adaptor::difference_type n);
    void increment();
    void decrement();

    template <
        class OtherDerived, class OtherIterator, class V, class C, class R, class D
    >   
    typename iterator_adaptor::difference_type distance_to(
        iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;

 private:
    Base m_iterator; // exposition only
};

iterator_adaptor requirements

static_cast<Derived*>(iterator_adaptor*) shall be well-formed. The Base argument shall be Assignable and Copy Constructible.

iterator_adaptor base class parameters

The V', C', R', and D' parameters of the iterator_facade used as a base class in the summary of iterator_adaptor above are defined as follows:

V' = if (Value is use_default)
          return iterator_traits<Base>::value_type
      else
          return Value

C' = if (CategoryOrTraversal is use_default)
          return iterator_traversal<Base>::type
      else
          return CategoryOrTraversal

R' = if (Reference is use_default)
          if (Value is use_default)
              return iterator_traits<Base>::reference
          else
              return Value&
      else
          return Reference

D' = if (Difference is use_default)
          return iterator_traits<Base>::difference_type
      else
          return Difference

iterator_adaptor public operations

iterator_adaptor();

Requires:The Base type must be Default Constructible.
Returns:An instance of iterator_adaptor with m_iterator default constructed.

explicit iterator_adaptor(Base iter);

Returns:An instance of iterator_adaptor with m_iterator copy constructed from iter.

Base const& base() const;

Returns:m_iterator

iterator_adaptor protected member functions

Base const& base_reference() const;

Returns:A const reference to m_iterator.

Base& base_reference();

Returns:A non-const reference to m_iterator.

iterator_adaptor private member functions

typename iterator_adaptor::reference dereference() const;

Returns:*m_iterator
template <
class OtherDerived, class OtherIterator, class V, class C, class R, class D
>   
bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
Returns:m_iterator == x.base()

void advance(typename iterator_adaptor::difference_type n);

Effects:m_iterator += n;

void increment();

Effects:++m_iterator;

void decrement();

Effects:--m_iterator;
template <
    class OtherDerived, class OtherIterator, class V, class C, class R, class D
>   
typename iterator_adaptor::difference_type distance_to(
    iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
Returns:y.base() - m_iterator