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.

Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top