Biblioteca C ++ Istream - sentry

Descripción

Se utiliza para preparar la transmisión para la entrada. Todas las funciones miembro que realizan una operación de entrada construyen automáticamente un objeto de esta clase y luego lo evalúan (que devuelve verdadero si no se estableció una bandera de estado). Solo si este objeto se evalúa como verdadero, la función intenta la operación de entrada (de lo contrario, regresa sin realizarla). Antes de regresar, la función destruye el objeto centinela.

Declaración

A continuación se muestra la declaración de 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;
};

Miembros

  • explicit sentry (basic_istream& is, bool noskipws = false); - Prepara el flujo de salida para una operación de salida, realizando las acciones descritas anteriormente.

  • ~sentry(); - No realiza operaciones (definido por la implementación).

  • explicit operator bool() const; - Cuando se evalúa el objeto, devuelve un valor bool que indica si el constructor sentry realizó con éxito todas sus tareas: Si en algún momento del proceso de construcción, se estableció un indicador de error interno, esta función siempre devuelve falso para ese objeto.

Ejemplo

En el siguiente ejemplo se 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;
}

Compilemos y ejecutemos el programa anterior, esto producirá el siguiente resultado:

digits parsed: 5552326