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