Иногда определенное значение должно меняться только в ограниченном объеме. Защитные классы сохраняют копию текущего состояния какого-либо объекта (или аспекта объекта) и сбрасывают состояние объекта во время разрушения, отменяя любые изменения, через которые объект мог пройти.
Стратегия класса сохранения полезна при использовании потоковых объектов ввода/вывода. Объекты-манипуляторы могут изменять некоторый аспект потока во время ввода или вывода. Состояние, измененное манипулятором, обычно прилипает к его новой стоимости после транзакции ввода-вывода. Это может быть проблемой, если манипуляторы используются в функции, которая не должна внешне изменять состояние потока.
Потокosсохранит свой новый шестидесятичный режим печати после призыва к<hex_my_byte>. Режим печати потока может быть сохранен и восстановлен с помощью ручных вызовов в состояние потока, инспектирующего и мутирующего функции члена. Ручной метод становится громоздким, если основная функциональность является сложной и/или должна быть безопасной. Класс сохранения может реализовать лучшую стратегию "приобретение ресурсов - инициализация".
См.примерниже для лучшего кода, используя классы сохранения.
state_type— базовый класс IOStreams<std::ios_base>. Пользователь обычно размещает фактический объект ввода, вывода или комбинированного потока для параметра типа состояния, а не объект базового класса. Первый конструктор берет объект потока и сохраняет ссылку на поток и текущее значение конкретного атрибута потока. Второй конструктор работает так же, как первый, и использует свой второй аргумент, чтобы изменить атрибут потока на новое значениеaspect_type. Деструктор восстанавливает атрибут потока к сохраненному значению. Восстановление может быть активировано рано (и часто) с функцией<restore>.
state_typeявляется версией шаблона базового класса IOStreams<std::basic_ios<Ch, Tr>>, где<Ch>является типом персонажа и<Tr>является классом признаков персонажа. Пользователь обычно размещает фактический объект ввода, вывода или комбинированного потока для параметра типа состояния, а не объект базового класса. Первый конструктор берет объект потока и сохраняет ссылку на поток и текущее значение конкретного атрибута потока. Второй конструктор работает так же, как первый, и использует свой второй аргумент, чтобы изменить атрибут потока на новое значениеaspect_type. Деструктор восстанавливает атрибут потока к сохраненному значению. Восстановление может быть активировано рано (и часто) с помощью функции<restore>.
Advanced IOStreams State Saver Class Templates
Class Template
Saved Attribute
Attribute Type
Reading Method
Writing Method
<boost::io::basic_ios_iostate_saver<Ch, Tr>>
Неисправность потока,
<std::ios_base::iostate>
<rdstate>
<clear>
<boost::io::basic_ios_exception_saver<Ch, Tr>>
В каких случаях возникает исключение
<std::ios_base::iostate>
<exceptions>
<exceptions>
<boost::io::basic_ios_tie_saver<Ch, Tr>>
Выходной поток синхронизирован с потоком
<std::basic_ostream<Ch, Tr> *>
<tie>
<tie>
<boost::io::basic_ios_rdbuf_saver<Ch, Tr>>
Буфер потока, связанный с потоком
<std::basic_streambuf<Ch, Tr> *>
<rdbuf>
<rdbuf>
<boost::io::basic_ios_fill_saver<Ch, Tr>>
Характер, используемый для прокладки негабаритной ширины поля
<Ch>
<fill>
<fill>
<boost::io::basic_ios_locale_saver<Ch, Tr>>
Локальная информация, связанная с потоком
<std::locale>
<getloc>(от<std::ios_base>)
<imbue>(от<std::basic_ios<Ch, Tr>>)
Notes
Когда флаги государств-неудачников и/или флаги государств-неудачников, наблюдающие за флагами, меняются, исключение бросается, если совпадение происходит между двумя наборами флагов. Это может означать, чтоконструктор или разрушитель этих шаблонов классов может бросить.
Когда соответствующий буфер потока изменяется, набор состояния отказа потока сбрасывается на "good", если адрес данного буфера потока не является NULL, но состояние отказа "bad" устанавливается, если этот адрес является NULL. Это означает, что сохраненное состояние отказа "good" может быть восстановлено как "bad", если поток лишен связанного буфера потока. Хуже того, учитывая буферный адрес NULL потока, исключение бросается, если за состоянием отказа наблюдают. Это может означать, чтоконструктор или разрушитель этих шаблонов классов может бросить.
Сохранительиспользует классstd::basic_ios<Ch, Tr>для извлечения информации, хотя он мог использовать функциональность вstd::ios_base. Проблема в том, что версии необходимых функций вios_baseне полиморфно связаны с теми, что вbasic_ios. Классы потоков, которые будут использоваться с классами сохранения, должны использовать версии функций-членов, наиболее близких к ним по наследству, что означает те, которые находятся вbasic_ios.
Классы сохранения для определяемой пользователем информации форматирования имеют этот формат:
#include <iosfwd> // for std::ios_base (declaration)
class saver_class
{
typedef std::ios_base state_type;
typedef int index_type;
typedef implementation_defined aspect_type;
explicit saver_class( state_type &s, index_type i );
saver_class( state_type &s, index_type i, aspect_type const &new_value );
~saver_class();
void restore();
};
Индексiразличает определенные пользовательские атрибуты форматирования. Индекс может быть определен только во время выполнения (скорее всего, со статической функцией<std::ios_base::xalloc>).
state_type— базовый класс системы IOStreams,<std::ios_base>. Пользователь обычно размещает фактический объект ввода, вывода или комбинированного потока для параметра типа состояния, а не объект базового класса. Первый конструктор берет объект потока и индексирует и сохраняет ссылку на поток и текущее значение конкретного атрибута потока. Второй конструктор работает так же, как первый, и использует свой третий аргумент, чтобы изменить атрибут потока на новое значениеaspect_type. Деструктор восстанавливает атрибут потока к сохраненному значению. Восстановление может быть активировано рано (и часто) с функцией<restore>члена.
Существует три класса (шаблоны) для комбинированных вкладчиков атрибутов. Класс сохранения<boost:io::ios_base_all_saver>сочетает в себе функциональность всех основных классов сохранения атрибутов. У него есть конструктор, который берет поток, чтобы сохранить его состояние.<boost::io::basic_ios_all_saver>сочетает в себе функциональность всех расширенных шаблонов класса сохранения атрибутов и комбинированного базового класса сохранения атрибутов. У него есть конструктор, который берет поток, чтобы сохранить его состояние. Класс сохранения<boost::io::ios_all_word_saver>объединяет классы сохранения, которые сохраняют определяемую пользователем информацию форматирования. Его конструктор берет поток, чтобы сохранить его атрибуты и индекс пользовательских атрибутов. Деструктор для каждого класса восстанавливает сохраненное состояние. Восстановление может быть активировано рано (и часто) для класса с функцией<restore>члена.
Код, используемый вобосновании, может быть улучшен в двух местах. Функция печати может использовать хранитель вокруг кода, который изменяет состояние форматирования. Или функция вызова может окружать вызов с помощью заставки. Или и то, и другое можно сделать, особенно если пользователь не знает, использует ли функция печати средство сохранения состояния. Если пользователю нужна серия изменений back & out, без окружения каждого изменения в отдельном блоке, функция<restore>участника может быть вызвана между каждым испытанием.
Started the library. Contributed the initial versions of the
format flags, precision, width, and user-defined format flags
saver classes. Contributed the initial versions of the success
state, success state exception flags, output stream tie, stream
buffer, character fill, and locale saver class templates.
Contributed the combined attribute classes and class template.
Contributed the test file ios_state_test.cpp.
Added the restore member functions, based on suggestions
by Gennadiy Rozental and Rob Stewart
13 Mar 2002, Daryle Walker
Initial version
Пересмотренный: 28 февраля 2005 года
Авторское право 2002, 2005 Дэрил Уокер. Использование, модификация и распространение регулируются Лицензией на программное обеспечение Boost версии 1.0. (См. сопроводительный файлLICENSE_1_0.txtили копию по адресу<http://www.boost.org/LICENSE_1_0.txt>.)
Статья I/O Stream-State Saver Library раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.