Y at-il un moyen de faire pos_type et off_type d'être un int64_t utilisant des traits?
-
12-10-2019 - |
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.
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.