Bibliothèque Istream C ++ - Sentry

La description

Il est utilisé pour préparer le flux pour l'entrée. Toutes les fonctions membres qui effectuent une opération d'entrée construisent automatiquement un objet de cette classe, puis l'évaluent (ce qui renvoie true si aucun indicateur d'état n'a été défini). Seulement si cet objet a la valeur true, la fonction tente l'opération d'entrée (sinon, elle retourne sans l'exécuter). Avant de revenir, la fonction détruit l'objet sentinelle.

Déclaration

Voici la déclaration 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;
};

Membres

  • explicit sentry (basic_istream& is, bool noskipws = false); - Prépare le flux de sortie pour une opération de sortie, en exécutant les actions décrites ci-dessus.

  • ~sentry(); - N'effectue aucune opération (définie par l'implémentation).

  • explicit operator bool() const; - Lorsque l'objet est évalué, il renvoie une valeur booléenne indiquant si le constructeur sentinelle a exécuté avec succès toutes ses tâches: Si à un moment donné du processus de construction, un indicateur d'erreur interne a été défini, cette fonction renvoie toujours false pour cet objet.

Exemple

L'exemple ci-dessous explique à propos de 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;
}

Compilons et exécutons le programme ci-dessus, cela produira le résultat suivant -

digits parsed: 5552326