Question

Je suis en train de comprendre quels traits sont, par exemple, des expressions comme typedef typename traits_type::off_type off_type dans la mise en œuvre de GNU fstream.

Cette question a été soulevée quand je travaillais avec des fichiers de plus de 2/4 Go. Je trouve que recompiler la bibliothèque STL, avec les drapeaux appropriés résout généralement les problèmes fichier volumineux.

Était-ce utile?

La solution

Les traits sont un moyen de propriétés « ajouter » à des types existants. Disons que nous sommes en train de créer un type de récipient qui contient un typedef pour dire son type de données contenues. La façon classique serait:

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

Ceci a pour inconvénient que nous devons créer notre classe juste pour contenir le typedef - par exemple. conteneurs tiers et les types de base ne peuvent pas être utilisés par le code qui suppose le type de Cont::contained_type. Nous avons donc introduit un struct traits, ce qui ajoute une indirection dans le processus:

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, le modèle de traits peut être un paramètre d'algorithmes utilisant, ce qui nous permet d'utiliser des caractères différents avec un seul type de données (voir la classe std::string).

Cela dit, je ne crois pas que les traits ont beaucoup à voir avec les systèmes 64 bits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top