Выполнить некоторые инструкции до и после выполнения блока

Мне нужен синтаксис, который позволяет мне запускать блок кода с предыдущей инициализацией некоторых переменных, и после выполнения блока кода мне нужно выполнить некоторый код для освобождения некоторых других переменных.
Поэтому код, написанный внутри блока, должен выполняться в середине некоторых других операций.

Вот что я получил:

#define application(block) new Application(&argc, argv); auto __code= []() block ; __code(); mainApplication->launch()

Код, который вы видите, просто инициализирует приложение (объект C ++), поэтому я использую его следующим образом:

application({
< write the code >
});

Таким образом, я уверен, что приложение всегда инициализируется и запускается после блока.
Но мне интересно, есть ли способ избежать круглых скобок, чтобы я мог написать это так:

application{
< write the code >
};

Также этот способ работает, но он должен облегчить синтаксис.

1

Решение

Вы можете скрыть циклы for в макросе, чтобы добиться этого.

Вызов этого макроса, за которым следует блок (или один оператор), вставит объявление decl с этим блоком в качестве его области, и оценить preexpr до и postexpr после блока:

#define LET(decl, preexpr, postexpr) \
for (int _loop = 1; _loop;) \
for (decl; _loop && (preexpr, 1); postexpr, _loop = 0)

Это C, но должно работать и в C ++; Конечно, использование макросов обычно считается плохим стилем C ++. _loop переменная и циклы должны быть оптимизированы хорошим компилятором.

3

Другие решения

Обратить проблему. Передайте объект с соответствующими переменными в код. Пусть деструктор каждой переменной очистится.

4