Obwohl es viele Zeilen zum Thema reinterpret_cast gab, und wie schlecht es ist, bin ich immer noch verwirrt mit dem besten Weg, es zu vermeiden, besonders im Umgang mit Funktionen wie Lese und schreibe von fstream. Also, hier ist mein Dilemma ...Richtiges Casting für fstream Lesen und Schreiben von Elementfunktionen
Nehmen wir an, wir haben ein Integer-Array, das wir mit einigen Daten aus einer Datei füllen wollen.
std::ifstream iFile(...);
// presume that the type of this array is not a matter of choice
int *a = new int[ 100 ];
Wir waren mit ein paar verschiedenen Abgüssen lesen:
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);
Die erste (C-Stil) ist veraltet und neue Casts wir in C++ eingeführt aus guten Gründen. Der zweite ist unportabel und bietet keine Garantien. Der dritte ist langweilig zu schreiben und den Spaß zu verdirzen.
Gibt es eine Alternative dazu und wie soll ich darüber gehen?
EDIT:
Das Ziel ist, Code als portable zu erreichen und als normgerechte wie möglich.
Der dritte ist verzögert. Ich verstehe nicht, warum du keine reinterpret_cast verwenden kannst. Aber was genau meinen Sie mit "unportabel und bietet keine Garantien"? Beziehen Sie sich auf Endianness und mögliche zukünftige Änderungen der Größe von int? –
Obwohl das Verhalten von 'reininterpret_cast' technisch nicht garantiert ist, ist dieser Fall genau das, wofür Sie es verwenden sollten. Die meisten Implementationen unterscheiden sich kaum zwischen einem C-Style-Cast und einem "Reinterpret_cast". –
Das Verhalten von reinterpret_cast ist möglicherweise nicht definiert. Aber die Spezifikation sagt auch *