Domanda

Sto cercando di capire che cosa tratti sono, ad esempio, espressioni come typedef typename traits_type::off_type off_type nella implementazione GNU di fstream.

Questa domanda è venuto quando stavo lavorando con file più grandi di 2/4 GB. Ho trovato che ricompilare la libreria STL, con le bandiere appropriati di solito risolve i problemi di file di grandi dimensioni.

È stato utile?

Soluzione

I tratti sono un modo per "aggiungere" proprietà ai tipi esistenti. Diciamo che stiamo creando un tipo di contenitore, che contiene un typedef per raccontare il tipo di dati contenuti. Il modo classico potrebbe essere:

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

Questo ha lo svantaggio che dobbiamo creare la nostra classe solo per contenere il typedef - ad es. contenitori terzi e tipi fondamentali non possono essere utilizzate dal codice che assume tipo Cont::contained_type. Così si introduce una struct tratti, che aggiunge un riferimento indiretto nel processo:

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, il modello tratti può essere un parametro di algoritmi di usarlo, che ci permette di utilizzare tratti diversi con un solo tipo di dati (vedere la classe std::string).

Detto questo, non credo che i tratti hanno molto a che fare con i sistemi a 64 bit.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top