Frage

Ich versuche zu verstehen, was Merkmale sind zum Beispiel Ausdrücke wie typedef typename traits_type::off_type off_type in der GNU-Implementierung von fstream.

Diese Frage kam auf, als ich mit Dateien, die größer als 2/4 GB arbeitete. Ich fand, dass die STL-Bibliothek neu zu kompilieren, mit dem entsprechenden Flags in der Regel der großen Datei Probleme löst.

War es hilfreich?

Lösung

Traits sind ein Weg von „Hinzufügen“ Eigenschaften bestehender Typen. Lassen Sie uns sagen, dass wir einen Containertyp erstellen, die eine typedef enthält die darin enthaltenen Datentyp zu erzählen. Der klassische Weg wäre:

template <class T>
struct Cont { typedef T contained_type; }

Dies hat den Nachteil, dass wir unsere Klasse erstellen müssen nur die typedef enthalten - zB. Dritte Behälter und Grundtypen können nicht von Code verwendet werden, der Cont::contained_type Typ annimmt. So stellen wir eine Zug Struktur, die einen Umweg im Prozess fügt hinzu:

template <class C>
struct container_traits; // this struct would contain the contained_type for container C

template <class T>
struct Cont { ... } // no typedef here

template <class T>
struct container_traits<Cont<T> >
{
  typedef T contained_type; // by this, we say that the contained_type of Cont<T> is T
};

template <class T, unsigned N>
struct container_traits<T[N]>
{
  // this is the advantage of traits - we can add information for arrays, which can have no member typedefs
  typedef T contained_type;
};

Alos kann die Züge Vorlage ein Parameter von Algorithmen sei es mit, die uns verschiedene Merkmale mit einem einzelnen Datentyp (siehe std::string Klasse) zu verwenden, ermöglicht.

sagte, dass, ich glaube nicht, Züge haben viel mit 64-Bit-Systemen zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top