Недавно я узнал о Idoom Scope Guard С++. К сожалению, я не могу найти ничего хорошего.
Может ли кто-нибудь указать мне какую-нибудь полезную и полезную реализацию Scope Guard в С++?
Спасибо, Бода Сидо.
Недавно я узнал о Idoom Scope Guard С++. К сожалению, я не могу найти ничего хорошего.
Может ли кто-нибудь указать мне какую-нибудь полезную и полезную реализацию Scope Guard в С++?
Спасибо, Бода Сидо.
ScopeGuard включен в библиотеку Loki (рекламируется в Modern С++ Design от Andrei Alexandrescu, я уверен, что вы слышал эту замечательную книгу), и достаточно зрелый, чтобы использоваться в производственном коде, imo.
Просто для того, чтобы быть ясным: мы говорим о написании кода безопасного исключения с использованием RAII.
Дополнительное чтение (по StackOverflow): Использует ли использование ScopeGuard действительно лучший код?
Оригинальный класс ScopeGuard включен в эту статью доктора Добба Андрея Александреску и Петра Маргинеяна. Несколько улучшенная версия с некоторыми изменениями от Джошуа Лерера доступна здесь. (Версия Lehrer - это та, которую я использую в своих проектах.) Она также включена в библиотеку Loki.
У Boost теперь есть библиотека ScopeExit, более мощная, чем ScopeGuard (поскольку она может выполнять произвольный код, тогда как ScopeGuard может вызывать только одну существовавшую ранее существовавшую функцию).
Изменить: При всем этом сказано, что Scope Guard - это действительно просто приложение RAII, поэтому вы действительно должны по крайней мере понять концепцию того, как его реализовать.
Библиотека Folly (open-source из facebook) также обеспечивает реализацию (неудивительно, поскольку используется A.A.):
https://github.com/facebook/folly/blob/master/folly/ScopeGuard.h
Я думаю, что это и упомянутая здесь реализация MNMLSTC заслуживают внимания.
Объект "Scope Guard" - это всего лишь один экземпляр гораздо более широкой RAII idiom.
И нет единой реализации этого. Это то, что должен понимать программист на С++, а не только копирование/вставка. К счастью, это также довольно тривиально реализовать.
Вы создаете класс, который представляет какой-то ресурс. Когда экземпляр класса создается (одним из его конструкторов), он должен получить ресурс и выдавать исключение, если это не удается. Когда класс уничтожается, он должен утилизировать ресурс, выполняя всю необходимую очистку.
И... это. Вы также должны обрабатывать конструктор копирования и оператор присваивания (либо путем клонирования ресурса, либо путем создания этих двух функций, чтобы они никогда не вызывались).
Вам не нужно искать "хорошую реализацию", потому что вы сами будете писать десятки и десятки различных реализаций. Они тривиальны для записи, и их нельзя легко использовать повторно, потому что каждый из них переносит другой тип ресурса.
Есть предложение добавить scope_guard в стандартную библиотеку. Вы можете прочитать документ, который включает примерную реализацию, которую вы можете скопировать/вставить, здесь. См. Раздел 9.1 для реализации.
Ядро MNMLSTC имеет современную реализацию С++ 11 идиомы области видимости.