Так же интересным введением стала ScopeExit. Достаточно странный макрос на первый взгляд. Обычные смарт-поинтеры при высвобождении делают одну операцию - delete, но как отмечается в документации бывает накладно каждый раз писать класс, который принимает и как-то высвобождает ресурс. К примеру, хендл на файл (закрыть при исключении), хранилище объектов, которое возвращается в предыдущее состояние если какая-либо операция не удалась. Библиотека предлагает обойтись одним лишь макросом, которые встраивается прямо в функцию, которая испольняет какую либу операцию и нуждается в откате, если в ней произошло исключение. Выглядит это примерно так:
void Container::insert(Object const& obj)
{
bool commit = false;
m_vector.push_back(obj);
BOOST_SCOPE_EXIT( (&commit)(&m_vector) )
{
if(!commit)
m_vector.pop_back();
} BOOST_SCOPE_EXIT_END
// ... other operations ...
commit = true;
}
Здесь макрос создает оббертку прямо внутри функции, которая будет вызвана при выходе из функции в любой случае - через исключение и "нормальным" путем. В эту оббертку он передает ссылки на commit и m_vector, которые можно будет посмотреть/модифицировать при завершении функции. В данном примере, если дело не дошло до commit = true, то внутри BOOST_SCOPE_EXIT совершится откат на один элемент (к примеру исключение было брошено копи-конструктором класса Object). Вот так все просто и незатейливо. Стало даже интересно покопаться и посмотреть как все это реализовано, возможно идиома может быть полезна и в других задачах.
Буду писать далее, по возможности, про новые фичи и чем они могут быть полезны.
Комментариев нет:
Отправить комментарий