Подтвердить что ты не робот

Где я могу найти хорошую реализацию Scope Guard для моих проектов на С++?

Недавно я узнал о Idoom Scope Guard С++. К сожалению, я не могу найти ничего хорошего.

Может ли кто-нибудь указать мне какую-нибудь полезную и полезную реализацию Scope Guard в С++?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

Библиотека Folly (open-source из facebook) также обеспечивает реализацию (неудивительно, поскольку используется A.A.):

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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