2013-05-26 46 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的目的這裏以及讀取函數被調用後的結果是什麼?

UPDATE:

的問題是:

如果流包含字符串e.g「測試」,讀被調用後,值的類型變得字符*,其內容爲「測試」?

+1

Google是你的朋友。嘗試'reinterpret_cast C++',看看第二和第三個結果。 –

+2

該代碼片段似乎是嘗試編寫通用序列化例程。如果實際上發生了這種情況,則所顯示的方法相當天真和危險。 –

+0

@In silico如果流包含一個字符串,例如「test」,在調用read之後,value的類型變爲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這裏通過覆蓋值的實際類型將任意右值變成這樣的緩衝區。如果流確實包含正確類型的值,則結果是該值存儲在value中。

+0

如果流包含一個字符串,例如「test」,在調用read之後,value的類型變爲char *,其內容爲「test」? – Foredoomed

+0

value does not not改變它的類型,但是當調用這個函數時,如果值的類型是'char [5]',並且流包含5個字節''t','e','s ','t','\ 0'',那麼值確實會包含「test」(字符串對於這個例程不是一個好的應用程序,因爲它們通常不是固定的長度,如果它們是的話,終止)。 – microtherion

相關問題