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