coulée appropriée pour les fonctions membres de lecture et d'écriture fstream
-
10-10-2019 - |
Question
Bien qu'il y ait beaucoup de lignes écrites sur le thème de reinterpret_cast, et à quel point il est, je suis toujours perplexe avec la meilleure façon d'éviter, surtout lorsqu'ils traitent avec des fonctions telles que lecture et écriture à partir fstream. Alors, voici mon dilemme ...
Disons que nous avons un tableau entier que nous voulons remplir avec des données d'un fichier.
std::ifstream iFile( ... );
// presume that the type of this array is not a matter of choice
int *a = new int[ 100 ];
On peut lire avec quelques différents moulages:
iFile.read( (char *)a, sizeof( int ) * 100 );
iFile.read( reinterpret_cast< char * >( a ), sizeof( int ) * 100 );
iFile.read( static_cast< char * >( static_cast< void * >( ( a ) ), sizeof( int ) * 100 );
Le premier (style C) est obsolète et nouveau style jette nous introduit en C ++ pour de bonnes raisons. Le second est et offre pas non portable garanties. Le troisième est fastidieux d'écrire et gâte le plaisir.
est-il une alternative à cela et comment à ce sujet? Dois-je aller
EDIT:
Le but est d'obtenir un code aussi portable et standard conforme que possible.
La solution
Pourquoi ne vous déclarez pas a
comme char*
au lieu, comme ceci:
//int *a = new int[100];
char *a = new char[100];
iFile.read(a, 100 );
Pas de coulée nécessaire maintenant.
EDIT:
D'accord, je lis votre commentaire et la ligne commentée dans votre post. Dans ce cas:
iFile.read(reinterpret_cast<char*>(a), sizeof(int)*100);
devrait suffire.
Cependant, je choisi personnellement cast de style C:
iFile.read((char*)a, sizeof(int)*100);
C'est parce que je ne vois aucun danger ici. Tout semble bien, même avec le cast C-Style!
Meilleur casting encore moins fastidieux
Définir ce modèle de fonction:
template<class To, class From>
To any_cast(From v)
{
return static_cast<To>(static_cast<void*>(v));
}
utilisez-le:
//`From` type will be inferred from the function argument. :-)
iFile.read(any_cast<char*>(a), sizeof(int)*100);
On dirait bien?
Je pense que ce any_cast
peut être utilisé pour couler de tout type à tout type!