Языковая поддержка Scope Guard

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.


person Tomilov Anatoliy    schedule 12.08.2015    source источник
comment
Я не считаю необходимым менять базовый язык для поддержки этой идиомы. И действительно, мне не известно ни о каком таком предложении.   -  person cpplearner    schedule 12.08.2015
comment
@cpplearner С одной стороны, это не слишком большое (и не критичное) изменение синтаксиса. OTOH - это очень полезная функция для C ++.   -  person Tomilov Anatoliy    schedule 12.08.2015
comment
На данный момент я могу написать только вспомогательный класс - а зачем вам делать что-то еще? Возможно, такой класс должен быть в стандартной библиотеке, но мне кажется, это запах кода. Если у вас есть ресурс, вы должны инкапсулировать его в соответствующий управляющий класс, вам не следует пытаться вытолкнуть его извне.   -  person The Paramagnetic Croissant    schedule 12.08.2015
comment
Что ж, унарный ~, примененный к лямбда (который является выражением), уже имеет значение, так что это будет противоречить. Однако близкое решение может быть достигнуто с помощью небольшого количества магии макросов / шаблонов, представленной Андреем Александреску здесь (ближе к концу), и это выглядит как SCOPE_EXIT { /* code */ };.   -  person Quentin    schedule 12.08.2015
comment
@TheParamintageCroissant Скажем, у одного есть класс с методом, который выполняет регистрацию во время выполнения метода. При исключении или завершении простого метода записываемые данные становились бесполезными. Возможно, я не прав, но нужно написать такой вспомогательный класс для очистки лог-структур с семантикой защиты области видимости. Конечно, может быть, это должно быть частью STL.   -  person Tomilov Anatoliy    schedule 12.08.2015
comment
@Quentin После закрытия фигурной скобки должна быть закрывающая часть SCOPE_EXIT, это выглядит некрасиво.   -  person Tomilov Anatoliy    schedule 12.08.2015
comment
@ Ориент, нет, это действительно так. Андрей именно так перегрузил инфиксный оператор, поэтому скобки не нужны.   -  person Quentin    schedule 12.08.2015
comment
@ Квентин В самом деле? Поэтому стоит потратить время на просмотр связанного видео.   -  person Tomilov Anatoliy    schedule 12.08.2015
comment
@Orient, вы можете перейти примерно к 01:12:00, если у вас мало свободного времени, но вся презентация довольно интересна :)   -  person Quentin    schedule 12.08.2015
comment
@Orient Если есть необходимость в журналировании, то класс, выполняющий операцию, должен сам зарегистрировать его. Если вы реализуете это правильно, это всего лишь еще один вызов метода в деструкторе. Абсолютно нет необходимости проникать в класс извне, используя еще один вспомогательный класс или функцию.   -  person The Paramagnetic Croissant    schedule 12.08.2015
comment
@TheParamintageCroissant метод const. Структура журнала передается по ссылке на множество методов таких классов и совершенно иную (в смысле архитектурной гармонии) структуру, нежели класс. Исключение, сгенерированное в методах, обрабатывалось множество раз за время существования класса. Хорошо, неважно, это просто моя локальная проблема :) (возможно, решение состоит в том, чтобы передать структуру журнала по значению (возможно, с преобразованием / изготовлением в вспомогательный класс охраны области) и полагаться на его деструктор).   -  person Tomilov Anatoliy    schedule 12.08.2015