Quando dovrei occuparmi di std :: iostream :: sentry?

I riferimenti online hanno descrizioni piuttosto brevi e vaghe sullo scopo di std::iostream::sentry . Quando dovrei preoccuparmi di questa piccola critica? Se è destinato solo a essere utilizzato internamente, perché renderlo pubblico?

La maggior parte delle persone non scriverà mai alcun codice che debba occuparsi della creazione di oggetti sentinella. Un object sentry è necessario quando / se estrai dati da (o lo inserisci in) il buffer di stream che sottostà all’object stream stesso.

Finché il tuo operatore di inserimento / estrazione usa altri membri / operatori iostream per fare il suo lavoro, non deve occuparsi della creazione di un object sentinella (perché quegli altri operatori iostream creeranno e distruggeranno gli oggetti sentinella come necessario).

Viene utilizzato ogni volta che è necessario estrarre o generare dati con un stream. Cioè, ogni volta che si fa un operator>> , l’operatore di estrazione, o operator<< , l'operatore di inserimento.

Lo scopo è quello di semplificare la logica: "Sono impostati dei bit di errore? Sincronizza i buffer .Per i flussi di input, opzionalmente, ottieni uno spazio vuoto. Ok, pronto?"

Tutti gli operatori del stream di estrazione dovrebbero iniziare con:

 // second parameter to true to not skip whitespace, for input that uses it const std::istream::sentry ok(stream, icareaboutwhitespace); if (ok) { // ... } 

E tutti gli operatori del stream di inserimento dovrebbero iniziare con:

 const std::ostream::sentry ok(stream); if (ok) { // ... } 

È solo un modo di fare più pulito (qualcosa di simile a):

 if (stream.good()) { if (stream.tie()) stream.tie()->sync(); // the second parameter if (!noskipwhitespace && stream.flags() & ios_base::skipws) { stream >> std::ws; } } if (stream.good()) { // ... } 

ostream salta semplicemente la parte degli spazi bianchi.

L’input formattato per qualsiasi cosa tranne i tipi di base (int, double, ecc.) Non ha molto senso, e probabilmente solo da loro se preso da un stream non interattivo come un istringstream. Quindi probabilmente non dovresti implementare op >> in primo luogo, e quindi non devi preoccuparti degli oggetti sentinella.