Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Click here to view the latest version of this page.

Iterator Traits

Author: David Abrahams
Contact: dave@boost-consulting.com
Organization: Boost Consulting
Date: 2004-11-01
Copyright: Copyright David Abrahams 2004.
abstract:Header <boost/iterator/iterator_traits.hpp> provides the ability to access an iterator's associated types using MPL-compatible metafunctions.

Overview

std::iterator_traits provides access to five associated types of any iterator: its value_type, reference, pointer, iterator_category, and difference_type. Unfortunately, such a "multi-valued" traits template can be difficult to use in a metaprogramming context. <boost/iterator/iterator_traits.hpp> provides access to these types using a standard metafunctions.

Summary

Header <boost/iterator/iterator_traits.hpp>:

template <class Iterator>
struct iterator_value
{
    typedef typename 
      std::iterator_traits<Iterator>::value_type 
    type;
};

template <class Iterator>
struct iterator_reference
{
    typedef typename 
      std::iterator_traits<Iterator>::reference
    type;
};


template <class Iterator>
struct iterator_pointer
{
    typedef typename 
      std::iterator_traits<Iterator>::pointer 
    type;
};

template <class Iterator>
struct iterator_difference
{
    typedef typename
      detail::iterator_traits<Iterator>::difference_type
    type;
};

template <class Iterator>
struct iterator_category
{
    typedef typename
      detail::iterator_traits<Iterator>::iterator_category
    type;
};

Broken Compiler Notes

Because of workarounds in Boost, you may find that these metafunctions actually work better than the facilities provided by your compiler's standard library.

On compilers that don't support partial specialization, such as Microsoft Visual C++ 6.0 or 7.0, you may need to manually invoke BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION on the value_type of pointers that are passed to these metafunctions.

Because of bugs in the implementation of GCC-2.9x, the name of iterator_category is changed to iterator_category_ on that compiler. A macro, BOOST_ITERATOR_CATEGORY, that expands to either iterator_category or iterator_category_, as appropriate to the platform, is provided for portability.