右移的工作方式是:stringstream >> unsigned int >> unsigned int?

时间:2019-03-17 12:44:19

标签: c++ sfml stringstream

我正在阅读《示例的SFML游戏开发》一书,但我并没有真正理解这句话的作用。我从未见过这样的东西

void Anim_Directional::ReadIn(std::stringstream& l_stream){
l_stream >> m_frameStart >> m_frameEnd >> m_frameRow
  >> m_frameTime >> m_frameActionStart >> m_frameActionEnd;
}

2 个答案:

答案 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::stringstreamstd::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运算符链接起来。

相关问题