我正在阅读《示例的SFML游戏开发》一书,但我并没有真正理解这句话的作用。我从未见过这样的东西
void Anim_Directional::ReadIn(std::stringstream& l_stream){
l_stream >> m_frameStart >> m_frameEnd >> m_frameRow
>> m_frameTime >> m_frameActionStart >> m_frameActionEnd;
}
答案 0 :(得分:5)
在C ++中,他们有了“聪明”的想法,即用流来表示序列化/反序列化来重载右移和左移运算符。
stream >> var
表示“从流中读取var”。
对称地
stream << var
表示“将var放入流”
“流式处理”的输入或输出操作也将返回流,因此您可以链接以下操作:
stream >> var1 >> var2;
请注意,选择“流”仅是因为外观和优先级被认为是合理的,但是它仍然只是一个重载运算符,并且意味着例如没有严格的评估顺序。例如:
stream << f() << g();
可能是函数g
在函数f
之前被调用(有点令人惊讶)。
注意:排序问题是通过在最新的C ++标准(C ++ 17)中锤炼这种特殊情况来解决的。虽然它通常不成立,但可以保证移位运算符(大概是由于这个特定原因)。因此,在f()+g()
中,f
的调用可能晚于g
,但在f()<<g()
中则不会发生。
答案 1 :(得分:0)
C ++允许您重载>>
和<<
运算符。 std::stringstream
是std::istream
的派生词,它继承了>>
的{{1}}运算符重载。
std::istream
对于许多常见类型有很多重载。您可以找到其中的列表here。
典型的std::istream
std::istream
运算符重载如下所示:
>>
执行std::istream& operator>>(std::istream& stream, YourType& var) {
/*
** code here to parse and read a 'YourType' into 'var'
*/
/* var is set */
return stream; /* return the same stream to allow chaining */
}
时,将调用匹配的some_stream >> YourType_object
运算符重载。在上述情况下,我们的运算符重载是通过使用>>
的{{1}}参数和使用stream
的{{1}}来调用的。
some_stream
重载(以及var
重载)智能地返回其操作的流;从而允许将一系列YourType_object
运算符链接起来。