Когда мне следует заняться std::iostream::sentry?

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

3 ответа

Решение

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

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

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

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

Другие вопросы по тегам