As with STL iterators, the most fundamental service provided by MPL iterators is access to the sequence element to which they refer. To dereference a compile-time iterator, we can't simply apply the prefix * operator: runtime operator overloading is unavailable at compile time. Instead, the MPL provides us with an aptly named deref metafunction that takes an iterator and returns the referenced element.

    typedef mpl::vector<char,short,int,long,float,double> types;

    // locate the position of long in types
    typedef mpl::find<types,long>::type long_pos;

    // dereference the iterator
    typedef mpl::deref<long_pos>::type x;

    // check that we have the expected result

An iterator can also provide access to adjacent positions in a sequence, or traversal. In Chapter 4 we described the mpl::next and mpl::prior metafunctions, which produce an incremented or decremented copy of their integral argument. These primitives apply equally well to iterators:

    typedef mpl::next<long_pos>::type float_pos;
          , float

     Python   SQL   Java   php   Perl 
     game development   web development   internet   *nix   graphics   hardware 
     telecommunications   C++ 
     Flash   Active Directory   Windows