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

时间:2010-02-19 18:18:00

标签: c++ iostream

在线参考文献对std::iostream::sentry的目的有相当简短而含糊的描述。我应该什么时候关注这个小动物呢?如果它只是用于内部使用,为什么要公开呢?

3 个答案:

答案 0 :(得分:14)

只要您需要使用流提取或输出数据,就会使用它。也就是说,无论何时创建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只是跳过空白部分。

答案 1 :(得分:12)

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

只要您的插入/提取操作符使用其他iostream成员/运算符来完成其工作,就必须处理创建一个sentry对象(因为那些其他iostream操作符将创建并销毁哨兵对象)。

答案 2 :(得分:1)

除了基本类型(int,double等)之外的任何其他格式化输入都没有多大意义,并且可以说只有从非交互流(例如istringstream)中获取它们时才能使用它们。所以你可能不应该实现op&gt;&gt;首先,因此不必担心哨兵物。