代码之家  ›  专栏  ›  技术社区  ›  Emile Cormier

我应该什么时候关注std::iostream::sentry?

  •  24
  • Emile Cormier  · 技术社区  · 15 年前

    在线参考文献对 std::iostream::sentry . 我什么时候该关心这个小动物呢?如果只是内部使用,为什么要公开?

    3 回复  |  直到 15 年前
        1
  •  12
  •   Jerry Coffin    15 年前

    大多数人不会写任何需要处理创建哨兵对象的代码。当/如果从流对象本身的基础流缓冲区提取数据(或将其插入其中),则需要Sentry对象。

    只要插入/提取运算符使用其他iostream成员/运算符来完成其工作,它就会 必须处理创建哨兵对象(因为其他iostream操作员将根据需要创建和销毁哨兵对象)。

        2
  •  14
  •   GManNickG    15 年前

    它在需要用流提取或输出数据时使用。也就是说,每当你 operator>> ,提取运算符,或 operator<< ,插入运算符。

    其目的是简化逻辑:“是否设置了任何故障位?同步缓冲区。对于输入流,可以选择不使用任何空白。好的,准备好了吗?”

    所有提取流运算符都应以以下开头:

    // second parameter to true to not skip whitespace, for input that uses it
    const std::istream::sentry ok(stream, icareaboutwhitespace);
    
    if (ok)
    {
        // ...
    }
    

    所有插入流操作符都应该以以下开头:

    const std::ostream::sentry ok(stream); 
    
    if (ok)
    {
        // ...
    }
    

    这只是一种更清洁的方式(类似于):

    if (stream.good())
    {
        if (stream.tie())
            stream.tie()->sync();
    
        // the second parameter
        if (!noskipwhitespace && stream.flags() & ios_base::skipws)
        {
            stream >> std::ws;            
        }
    }
    
    if (stream.good())
    {
        // ...
    }
    

    ostream 跳过空白部分。

        3
  •  1
  •   anon    15 年前

    除了基本类型(int、double等)之外,其他任何类型的格式化输入都没有什么意义,而且只有在从非交互流(如IStringstream)中获取时,才有可能从这些类型中获取。因此,您可能不应该首先执行OP>,因此不必担心哨兵对象。