Где я могу найти хорошую реализацию Scope Guard для моих проектов C ++? - PullRequest
18 голосов
/ 12 августа 2010

Я только недавно узнал об идиоме Scope Guard C ++. К сожалению, я не могу найти хорошую реализацию этого.

Кто-нибудь может подсказать мне хорошую и полезную реализацию Scope Guard в C ++?

Спасибо, Бода Цидо.

Ответы [ 6 ]

15 голосов
/ 12 августа 2010

Оригинальный класс ScopeGuard включен в эту статью доктора Добба , написанную Андреем Александреску и Петру Марджиняном. Немного улучшенная версия с некоторыми изменениями от Джошуа Лерера доступна здесь . (Версию Лерера я использую в своих проектах.) Она также включена в библиотеку Loki .

Boost теперь имеет библиотеку ScopeExit , которая является более мощной, чем ScopeGuard (поскольку она может выполнять произвольный код, тогда как ScopeGuard может вызывать только одну существующую функцию).

Редактировать: С учетом всего вышесказанного Scope Guard на самом деле является просто конкретным приложением RAII, поэтому вам действительно следует хотя бы понять концепцию его реализации.

8 голосов
/ 12 августа 2010

ScopeGuard был включен в библиотеку Loki (анонсирован Андреем Александреску в Modern C ++ Design, я уверен, что вы слышали об этой великой книге) и достаточно зрел, чтобы его можно было использовать в производстве. код, имо.

Просто чтобы прояснить: Мы говорим о написании безопасного кода исключений с использованием RAII.

Дополнительное чтение (в StackOverflow): Действительно ли использование ScopeGuard приводит к улучшению кода?

4 голосов
/ 04 июня 2015

Библиотека Folly (с открытым исходным кодом от Facebook) также обеспечивает реализацию (что неудивительно, поскольку они используют AA):

https://github.com/facebook/folly/blob/master/folly/ScopeGuard.h

Я думаю, что это и реализация MNMLSTCоба упомянутых здесь заслуживают рассмотрения.

0 голосов
/ 14 августа 2014

Ядро MNMLSTC имеет современную реализацию C ++ 11 идиомы охраны области действия.

0 голосов
/ 03 мая 2014

Есть предложение добавить scope_guard в стандартную библиотеку.Вы можете прочитать документ, который включает пример реализации, которую вы можете скопировать / вставить, здесь .См. Раздел 9.1 для реализации.

0 голосов
/ 12 августа 2010

Объект "Scope Guard" - это всего лишь один из примеров более широкой RAII идиомы.

И нет единой реализации этого. Это то, что программист на С ++ должен понимать , а не просто копировать / вставлять. К счастью, это также довольно тривиально реализовать.

Вы создаете класс, который представляет некоторый вид ресурса. Когда создается экземпляр класса (одним из его конструкторов), он должен получить ресурс и выдать исключение, если это не удалось. Когда класс уничтожен, он должен избавиться от ресурса, выполнив всю необходимую очистку.

И ... это все. Вы также должны обработать конструктор копирования и оператор присваивания (либо путем клонирования ресурса, либо делая эти две функции закрытыми, чтобы они никогда не вызывались).

Вам не нужно находить «хорошую реализацию», потому что вы собираетесь сами написать десятки и десятки различных реализаций. Их написать несложно, и их нелегко использовать повторно, поскольку каждый из них оборачивает свой тип ресурса.

...