public member class
<istream> <iostream>

std::istream::sentry

class sentry;
为输入准备流
用于在每次输入操作之前和之后执行一系列操作的成员类

它的构造函数按以下顺序对传递给它的流对象执行以下操作

  • 如果其内部错误标志中的任何一个被设置,则函数会设置其failbit标志并返回。
  • 如果它是一个关联流,则函数会刷新与之关联的流(如果其输出缓冲区不为空)。该类可以实现库函数延迟此刷新的方式,直到其关联的流缓冲区的下一次对overflow的调用。
  • 如果其skipws格式标志被设置,并且构造函数没有将true作为第二个参数(noskipws)传递,则所有前导的空白字符(根据区域设置)将被提取并丢弃。如果此操作耗尽了字符源,则函数会将failbiteofbit内部状态标志都设置为。
在构造过程中发生失败时,它可能会设置流的failbit标志。

其析构函数没有需要执行的操作。但是,实现可能会利用sentry对象的构造和析构来对流执行额外的初始化或清理操作,这些操作对所有输入操作都是通用的。

所有执行输入操作的成员函数都会自动构造此类的一个对象,然后对其进行求值(如果未设置状态标志,则返回true)。仅当此对象求值为true时,函数才会尝试执行输入操作(否则,它会在不执行操作的情况下返回)。在返回之前,函数会销毁sentry对象。

格式化输入操作operator>>会构造sentry对象,并将false作为第二个参数传递(这会跳过前导空白)。所有其他构造sentry对象的成员函数都将true作为第二个参数传递(这不会跳过前导空白)。

此类结构为
1
2
3
4
5
6
7
8
9
class sentry {
public:
  explicit sentry (istream& is, bool noskipws = false);
  ~sentry();
  operator bool() const;
private:
  sentry (const sentry&);             // not defined
  sentry& operator= (const sentry&);  // not defined
};
1
2
3
4
5
6
7
8
class sentry {
public:
  explicit sentry (istream& is, bool noskipws = false);
  ~sentry();
  explicit operator bool() const;
  sentry (const sentry&) = delete;
  sentry& operator= (const sentry&) = delete;
};

成员

explicit sentry (istream& is, bool noskipws = false);
为输出操作准备输出流,执行上述操作。
~sentry();
不执行任何操作(实现定义)。
explicit operator bool() const;
当对象被求值时,它会返回一个bool值,指示sentry构造函数是否成功执行了其所有任务:如果在构造过程的某个点设置了内部错误标志,则此函数总是为该对象返回false

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// istream::sentry example
#include <iostream>     // std::istream, std::cout
#include <string>       // std::string
#include <sstream>      // std::stringstream
#include <locale>       // std::isspace, std::isdigit

struct Phone {
  std::string digits;
};

// custom extractor for objects of type Phone
std::istream& operator>>(std::istream& is, Phone& tel)
{
    std::istream::sentry s(is);
    if (s) while (is.good()) {
      char c = is.get();
      if (std::isspace(c,is.getloc())) break;
      if (std::isdigit(c,is.getloc())) tel.digits+=c;
    }
    return is;
}

int main () {
  std::stringstream parseme ("   (555)2326");
  Phone myphone;
  parseme >> myphone;
  std::cout << "digits parsed: " << myphone.digits << '\n';
  return 0;
}

输出

digits parsed: 5552326


另见