Хотя было много строк, написанных на тему reinterpret_cast, и насколько это плохо, я все еще озадачен лучшим способом избежать этого, особенно когда речь идет о таких функциях, как читать и писать из fstream. Итак, вот моя дилемма ...Правильное литье для функций чтения и записи fstream
Предположим, у нас есть целочисленный массив, который мы хотим заполнить некоторыми данными из файла.
std::ifstream iFile(...);
// presume that the type of this array is not a matter of choice
int *a = new int[ 100 ];
Мы можем читать с несколькими различными слепков:
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);
Первый (C-стиль) является устаревшим и новый стиль проливает мы введены в C++ по уважительным причинам. Второй - неспособен и не дает никаких гарантий. Третье утомительно писать и портить удовольствие.
Есть ли альтернатива этому и как мне это сделать?
EDIT:
Цель состоит в том, чтобы достичь кода, как портативный и, как соответствующий стандартам, как это возможно.
Третий запатентован. Я не понимаю, почему вы не можете использовать reinterpret_cast. Но что именно вы подразумеваете под «unportable и не предлагает никаких гарантий»? Вы имеете в виду утверждение и возможные будущие изменения размера int? –
Хотя технически поведение 'reinterpret_cast' не гарантируется, этот случай - именно то, для чего вы должны его использовать. Большинство реализаций практически не имеют разницы между приложением C-стиля и 'reinterpret_cast'. –
Поведение reinterpret_cast не может быть определено. Но Spec также говорит, что *
* Так что, предполагая, что вы знаете свою машину (стандартный ПК), она должна работать нормально. –