public member class
<istream> <iostream>

std::basic_istream::sentry

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

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

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

其析构函数没有必需执行的操作。但实现可以利用sentry对象的构造和析构来对流执行所有输入操作通用的附加初始化或清理操作。

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

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

此类结构为
1
2
3
4
5
6
7
8
9
class sentry {
public:
  explicit sentry (basic_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 (basic_istream& is, bool noskipws = false);
  ~sentry();
  explicit operator bool() const;
  sentry (const sentry&) = delete;
  sentry& operator= (const sentry&) = delete;
};

成员

explicit sentry (basic_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


另见