Когда мне следует заняться std :: iostream :: sentry? - PullRequest
26 голосов
/ 19 февраля 2010

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

Ответы [ 3 ]

14 голосов
/ 19 февраля 2010

Используется всякий раз, когда вам нужно извлечь или вывести данные с помощью потока.То есть всякий раз, когда вы делаете 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 просто пропускает часть пробела.

12 голосов
/ 19 февраля 2010

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

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

1 голос
/ 19 февраля 2010

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

...