Pregunta

Estoy tratando de entender qué rasgos son, por ejemplo, expresiones como typedef typename traits_type::off_type off_type en la implementación GNU de fstream.

Esta pregunta surgió cuando estaba trabajando con archivos de más de 2/4 GB. He descubierto que recompilar la biblioteca STL, con las banderas apropiadas generalmente resuelve los problemas de archivos de gran tamaño.

¿Fue útil?

Solución

Los rasgos son una forma de propiedades a los tipos existentes "agregando". Digamos que estamos creando un tipo de contenedor, que contiene un typedef para contar su tipo de datos contenida. La manera clásica sería:

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

Esto tiene la desventaja de que tenemos que crear nuestra clase sólo para contener el typedef - por ejemplo. contenedores de terceros y los tipos básicos no pueden ser utilizados por el código que asume tipo Cont::contained_type. Así introducimos una estructura rasgos, lo que añade una indirección en el proceso:

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, la plantilla de rasgos puede ser un parámetro de algoritmos de usarlo, lo que nos permite usar diferentes rasgos con un tipo de datos único (véase la clase std::string).

Dicho esto, no creo rasgos tienen mucho que ver con los sistemas de 64 bits.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top