【问题标题】:How does this right shifts work: stringstream >> unsigned int >> unsigned int?这种右移是如何工作的:stringstream >> unsigned int >> unsigned int?
【发布时间】:2019-08-07 23:38:02
【问题描述】:

我正在使用 SFML Game Development by Examples 这本书,我真的不明白这句话的作用。我从来没有见过这样的事情

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

【问题讨论】:

  • 这个功能已经成为 C++ 的一部分很长时间了。由于您以前从未见过这样的事情,看来您迫切需要good C++ book

标签: c++ sfml stringstream


【解决方案1】:

在 C++ 中,他们获得了用流重载右移和左移运算符来表示序列化/反序列化的“聪明”想法。

stream >> var

表示“从流中读取变量”。

对称

stream << var

意思是“将变量放入流”

“流式”输入或输出的操作也返回流,因此您可以链式操作,如:

stream >> var1 >> var2;

请注意,选择“流”只是因为外观和优先级被认为是合理的,但它仍然只是一个重载的运算符,并且意味着例如没有严格的评估顺序。例如在:

stream << f() << g();

可能是函数 g 在函数 f 之前被调用(有点奇怪)。

注意:排序问题是通过在上一个 C++ 标准 (C++17) 中敲击这种特殊情况来处理的。虽然它一般不成立,但对于班次操作员来说是有保证的(大概是出于这个特定原因)。所以在f()+g()f 的调用时间可能比g 晚,但在f()&lt;&lt;g() 中这不会发生。

【讨论】:

  • “没有严格的评估顺序” 这在 C++17 中已修复。
【解决方案2】:

C++ 允许您重载 &gt;&gt;&lt;&lt; 运算符。 std::stringstreamstd::istream 的派生词,它继承了 std::istream&gt;&gt; 运算符重载。

std::istream 有许多常见类型的重载。你可以找到他们的名单here

典型的std::istream &gt;&gt; 运算符重载如下所示:

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 &gt;&gt; YourType_object 时,将调用匹配的&gt;&gt; 运算符重载。在上述情况下,我们的运算符重载使用stream 参数调用some_streamvarYourType_object

&gt;&gt; 重载(以及 &lt;&lt; 重载)智能地返回它们操作的流;因此,允许链接一系列&gt;&gt; 运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2012-12-15
    • 1970-01-01
    • 2016-02-26
    • 2014-04-05
    • 2013-09-03
    相关资源
    最近更新 更多