我是C ++的新手,并按如下方式阅读一些代码:
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函数后的结果是什么?
更新:
问题是:
如果流包含一个字符串,例如“test”,则在调用read之后,value的类型变为char *并且其内容为“test”?
答案 0 :(得分:2)
reinterpret_cast<T>()
强制将给定的位模式解释为您想要的类型。这是演员阵容中最“野蛮”的。
来自MSDN:
允许任何指针转换为任何其他指针类型。还允许将任何整数&gt;类型转换为任何指针类型,反之亦然。
滥用reinterpret_cast运算符很容易造成不安全。除非所需的&gt;转换本质上是低级别的,否则您应该使用其他一个转换运算符。 reinterpret_cast运算符可用于
char*
到int*
或&gt;One_class*
到Unrelated_class*
之类的转换,这些转换本质上是不安全的。
reinterpret_cast
的结果无法安全地用于除&gt;强制转换为原始类型之外的任何内容。其他用途充其量只是不可移植的。
在你的例子中
template<typename T>
std::istream & read(std::istream* stream, T& value){
return stream->read(reinterpret_cast<char*>(&value), sizeof(T));
}
它用于从给定流中读取并将读取的数据转换为char*
以将其视为字节序列(假设char
默认为无符号)。
答案 1 :(得分:0)
read
函数只是将一些字节读入缓冲区,reinterpret_cast
这里通过覆盖值的实际类型将任意rvalue转换为这样的缓冲区。如果流实际上包含正确类型的值,则结果是该值存储在value
中。