Biblioteca C ++ Istream - sentinela

Descrição

É usado para preparar o fluxo para entrada. Todas as funções de membro que executam uma operação de entrada constroem automaticamente um objeto desta classe e o avaliam (que retorna verdadeiro se nenhum sinalizador de estado foi definido). Somente se este objeto for avaliado como verdadeiro, a função tentará a operação de entrada (caso contrário, ela retornará sem realizá-la). Antes de retornar, a função destrói o objeto sentinela.

Declaração

A seguir está a declaração para std :: basic_istream :: sentry.

C ++ 98

class sentry {
   public:
      explicit sentry (basic_istream& is, bool noskipws = false);
      ~sentry();
   operator bool() const;
   private:
      sentry (const sentry&);             
      sentry& operator= (const sentry&);  
};

C ++ 11

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;
};

Membros

  • explicit sentry (basic_istream& is, bool noskipws = false); - Prepara o fluxo de saída para uma operação de saída, executando as ações descritas acima.

  • ~sentry(); - Não executa nenhuma operação (definido pela implementação).

  • explicit operator bool() const; - Quando o objeto é avaliado, ele retorna um valor booleano indicando se o construtor da sentinela realizou com sucesso todas as suas tarefas: Se em algum ponto do processo de construção, um sinalizador de erro interno foi definido, esta função sempre retorna falso para aquele objeto.

Exemplo

No exemplo a seguir explica sobre std :: basic_istream :: sentry.

#include <iostream>
#include <string>
#include <sstream>
#include <locale>

struct Phone {
   std::string digits;
};

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;
}

Vamos compilar e executar o programa acima, isso produzirá o seguinte resultado -

digits parsed: 5552326