Правильное приведение для функций чтения и записи fstream - PullRequest
2 голосов
/ 12 января 2011

Хотя на тему reinterpret_cast было написано много строк, и насколько это плохо, я все еще озадачен лучшим способом избежать этого, особенно когда имеешь дело с такими функциями, как чтение и запись из 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 ++ по веским причинам.Второй не переносим и не дает никаких гарантий.Третий утомительно писать и портит веселье.

Есть ли альтернатива этому и как мне поступить?

РЕДАКТИРОВАТЬ:

Цель состоит в том, чтобыдобиться максимально переносимого кода и соответствия стандарту.

1 Ответ

4 голосов
/ 12 января 2011

Почему бы вам не объявить a как char* вместо этого, например так:

//int *a = new int[100]; 
char *a = new char[100];
iFile.read(a, 100 ); 

Не требуется кастинг.


РЕДАКТИРОВАТЬ:

Хорошо, я прочитал ваш комментарий и закомментированную строку в вашем посте.В этом случае:

iFile.read(reinterpret_cast<char*>(a), sizeof(int)*100);

должно быть достаточно.

Однако я бы лично выбрал приведение в стиле C:

iFile.read((char*)a, sizeof(int)*100);

Это потому, что я не вижулюбая опасность здесь.Все выглядит хорошо, даже с использованием C-Style!


Лучший, но менее утомительный состав

Определите этот шаблон функции:

template<class To, class From>
To any_cast(From v)
{
    return static_cast<To>(static_cast<void*>(v));
}

Затем используйте его:

//`From` type will be inferred from the function argument. :-) 
iFile.read(any_cast<char*>(a), sizeof(int)*100);

Выглядит хорошо?

Думаю, это any_cast можно использовать для приведения любого типа к любому типу!

...