¿Hay una manera de hacer pos_type y off_type para ser un int64_t usando rasgos?
-
12-10-2019 - |
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.
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.