iterator_traits-Struktur

Eine Vorlagenhilfsstruktur wird verwendet, um alle wichtigen Typdefinitionen anzugeben, die ein Iterator haben sollte.

Syntax

struct iterator_traits {
   typedef typename Iterator::iterator_category iterator_category;
   typedef typename Iterator::value_type value_type;
   typedef typename Iterator::difference_type difference_type;
   typedef difference_type distance_type;
   typedef typename Iterator::pointer pointer;
   typedef typename Iterator::reference reference;
   };

Hinweise

Die Vorlagenstruktur definiert die Membertypen.

  • iterator_category: ein Synonym für Iterator::iterator_category.

  • value_type: ein Synonym für Iterator::value_type.

  • difference_type: ein Synonym für Iterator::difference_type.

  • distance_type: ein Synonym für Iterator::difference_type.

  • pointer: ein Synonym für Iterator::pointer.

  • reference: ein Synonym für Iterator::reference.

Die Teilspezialisierungen bestimmen die kritischen Typen, die einem Objektzeiger vom Typ "Type *" oder "const Type*" zugeordnet sind.

In dieser Implementierung können Sie auch mehrere Vorlagenfunktionen verwenden, die keine Teilspezialisierung benutzen:

template <class Category, class Type, class Diff>
C _Iter_cat(const iterator<Category, Ty, Diff>&);

template <class Ty>
random_access_iterator_tag _Iter_cat(const Ty *);

template <class Category, class Ty, class Diff>
Ty *val_type(const iterator<Category, Ty, Diff>&);

template <class Ty>
Ty *val_type(const Ty *);

template <class Category, class Ty, class Diff>
Diff *_Dist_type(const iterator<Category, Ty, Diff>&);

template <class Ty>
ptrdiff_t *_Dist_type(const Ty *);

welche mehrere der gleichen Typen indirekter bestimmen. Sie verwenden diese Funktionen als Argumente in einem Funktionsaufruf. Der einzige Zweck besteht darin, einen nützlichen Klassenvorlagenparameter für die aufgerufene Funktion zu liefern.

Beispiel

// iterator_traits.cpp
// compile with: /EHsc
#include <iostream>
#include <iterator>
#include <vector>
#include <list>

using namespace std;

template< class it >
void
function( it i1, it i2 )
{
   iterator_traits<it>::iterator_category cat;
   cout << typeid( cat ).name( ) << endl;
   while ( i1 != i2 )
   {
      iterator_traits<it>::value_type x;
      x = *i1;
      cout << x << " ";
      i1++;
   };
   cout << endl;
};

int main( )
{
   vector<char> vc( 10,'a' );
   list<int> li( 10 );
   function( vc.begin( ), vc.end( ) );
   function( li.begin( ), li.end( ) );
}
/* Output:
struct std::random_access_iterator_tag
a a a a a a a a a a
struct std::bidirectional_iterator_tag
0 0 0 0 0 0 0 0 0 0
*/

Anforderungen

Header:<iterator>

Namespace: std

Siehe auch

<iterator>
Threadsicherheit in der C++-Standardbibliothek
C++-Standardbibliotheksreferenz