Когда я должен относиться к std:: iostream:: sentry?

В онлайн-ссылках есть довольно краткие и смутные описания с целью std::iostream::sentry. Когда я должен заниматься этим маленьким твари? Если он предназначен только для внутреннего использования, зачем публиковать его?

Ответ 1

Большинство людей никогда не напишут код, который должен иметь дело с созданием часовых объектов. Частный объект необходим, когда/если вы извлекаете данные из (или вставляете их) в буфер потока, который лежит в основе самого объекта потока.

Пока ваш оператор вставки/извлечения использует другие члены/операторы iostream для выполнения своей работы, ему не нужно иметь дело с созданием объекта-часового (поскольку эти другие операторы iostream будут создавать и уничтожать объекты-дескрипторы по мере необходимости).

Ответ 2

Он используется всякий раз, когда вам нужно извлекать или выводить данные с потоком. То есть, когда вы делаете operator>>, оператор извлечения или operator<<, оператор вставки.

Цель состоит в том, чтобы упростить логику: "Устанавливаются ли какие-либо биты ошибок? Синхронизируйте буферы. Для входных потоков, необязательно, получите какие-либо пробелы. Хорошо, готов?"

Все операторы потока извлечения должны начинаться с:

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

if (ok)
{
    // ...
}

И все операторы потока вставки должны начинаться с:

const std::ostream::sentry ok(stream); 

if (ok)
{
    // ...
}

Это просто более чистый способ сделать (что-то похожее):

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 просто пропускает пробельную часть.

Ответ 3

Отформатированный ввод для чего-либо, кроме базовых типов (int, double и т.д.), не имеет большого смысла и, возможно, только из них, когда он берется из неинтерактивного потока, такого как istringstream. Таким образом, вы, вероятно, не должны внедрять op → в первую очередь и, следовательно, не должны беспокоиться о сторожевых объектах.