在线参考文献对std::iostream::sentry
的目的有相当简短而含糊的描述。我应该什么时候关注这个小动物呢?如果它只是用于内部使用,为什么要公开呢?
答案 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;首先,因此不必担心哨兵物。