2013-05-26 4 views
2

Я новичок в C++ и читать код следующим образом:Какова цель reinterpret_cast

template<typename T> 
std::istream & read(std::istream* stream, T& value){ 
    return stream->read(reinterpret_cast<char*>(&value), sizeof(T)); 
} 

и называют его:

size_t size; 
read(&stream, size); 

Может кто-нибудь объяснить, что цель reinterpret_cast используется здесь и что такое результат после вызова функции read?

UPDATE:

Возникает вопрос:

Если поток содержит строку например «тест», после чтения вызывается, тип-значение становится символ * и его содержание «тест»?

+1

Google - ваш друг. Попробуйте 'reinterpret_cast C++' и посмотрите на второй и третий результаты. –

+2

Этот фрагмент кода представляет собой попытку написать общую процедуру сериализации. Если это на самом деле то, что происходит, показанный подход является довольно наивным и опасным. –

+0

@In silico Если поток содержит строку, например «test», после вызова read, тип значения становится char *, а его содержимое «test»? – Foredoomed

ответ

2

reinterpret_cast<T>() заставляет данный бит-шаблон интерпретироваться как желаемый тип. Это самый «жестокий» среди бросков.

От MSDN:

Позволяет любой указатель быть преобразован в любой другой тип указателя. Также позволяет преобразовать любой интегральный тип в любой тип указателя и наоборот.

Неправильное использование оператора reinterpret_cast может быть небезопасным. Если желаемое преобразование по сути является низкоуровневым, вы должны использовать один из других операторов трансляции. Оператор reinterpret_cast может использоваться для преобразований, таких как char*, int*, или>One_class* - Unrelated_class*, которые по своей сути являются небезопасными.

Результат reinterpret_cast не может безопасно использоваться для чего-либо иного, кроме того, что он> отбрасывается обратно в исходный тип. Другие виды использования, в лучшем случае, не являются переносимыми.


В вас примере

template<typename T> 
std::istream & read(std::istream* stream, T& value){ 
    return stream->read(reinterpret_cast<char*>(&value), sizeof(T)); 
} 

используется для чтения из данного потока и отбрасывать данные на чтение char* рассматривать его как последовательность байтов (при условии, char беззнаковым по умолчанию).

+0

Хорошо, сделано ... Не знаю о синтаксисе. Спасибо за подсказку. –

0

Функция read просто считывает количество байтов в буфер, а reinterpret_cast здесь превращает произвольное значение r в такой буфер, переопределяя фактический тип значения. Если поток действительно содержит значение правильного типа, результатом является то, что это значение сохраняется в value.

+0

Если поток содержит строку, например «test», после вызова read, тип значения становится char *, а его содержимое «test»? – Foredoomed

+0

Значение ** не ** меняет его тип, но да, если тип значения был 'char [5]' при вызове этой функции, а поток содержал 5 байтов ''t', 'e', ​​'s ',' t ',' \ 0'', тогда значение действительно будет содержать «тест» (строки НЕ являются хорошим приложением для этой подпрограммы, поскольку они обычно не фиксированной длины, и если они есть, терминатор). – microtherion

Смежные вопросы