Scope Guard - это очень подходящая идиома для C ++. Он хорошо взаимодействует с исключениями и соответствует RAII. C ++ не поддерживает встроенные средства защиты области видимости. Я имею в виду чистый синтаксис. На данный момент я могу написать только вспомогательный класс: c-tor хранит лямбда как член данных, а d-tor вызывает лямбда (при выходе из области видимости или при выбросе исключения).
Есть ли в настоящее время какие-либо предложения по удобному синтаксису для защиты области видимости в C ++?
Я имею в виду что-то вроде int * i = new int; ~[&i] { if (i) { delete i; i = nullptr; } }; ...
или даже (с захватом как ref по умолчанию) ~{ /* statments */; }
. Когда лямбда-синтаксис - это просто синтаксический сахар для struct
с operator ()
, может быть аналогичный лямбда-синтаксис для "встроенного" -деструктора анонимного struct
.
~
, примененный к лямбда (который является выражением), уже имеет значение, так что это будет противоречить. Однако близкое решение может быть достигнуто с помощью небольшого количества магии макросов / шаблонов, представленной Андреем Александреску здесь (ближе к концу), и это выглядит какSCOPE_EXIT { /* code */ };
. - person Quentin   schedule 12.08.2015SCOPE_EXIT
, это выглядит некрасиво. - person Tomilov Anatoliy   schedule 12.08.2015const
. Структура журнала передается по ссылке на множество методов таких классов и совершенно иную (в смысле архитектурной гармонии) структуру, нежели класс. Исключение, сгенерированное в методах, обрабатывалось множество раз за время существования класса. Хорошо, неважно, это просто моя локальная проблема :) (возможно, решение состоит в том, чтобы передать структуру журнала по значению (возможно, с преобразованием / изготовлением в вспомогательный класс охраны области) и полагаться на его деструктор). - person Tomilov Anatoliy   schedule 12.08.2015