Здравствуйте, jyuyjiyuijyu, Вы писали:
J>привет
J>подумал (возможно ошибочно) удобно было бы совместить loki_on_block_exit и boost_scope_exit J>как вам? (работает под MSVC)
Поясню.
scope_exit/loki_on_block_exit уже затычки на недоработку языка (отсутствие "using")
Улучшение этих костылей с помощью препроцессора — фейспалм.
Здравствуйте, bnk, Вы писали:
bnk>
bnk>Поясню. bnk>scope_exit/loki_on_block_exit уже затычки на недоработку языка (отсутствие "using") bnk>Улучшение этих костылей с помощью препроцессора — фейспалм.
да макросы они повсюду в C/C++, а так вроде удобно получилось
Здравствуйте, BulatZiganshin, Вы писали:
BZ>а как?? я не являюсь глубоким знатоком c++, пробовал сделать template — не вышло. и вообще удобней было бы присваивание BZ>on_exit _ = [&]{printf("on_exit\n");}; BZ>но я не знаю как описать тип для этого
Нужно через функцию посредника. То есть on_exit будет шаблоном, но тип в этот шаблон будет подставлять функция посредник. Использование вот такое:
auto &&temp = make_on_exit([&]{printf("on_exit\n");});
Либо не обычная функция, а какой-нибудь оператор типа умножения, тогда будет вот так:
auto &&temp = auxiliary{} * [&]{printf("on_exit\n");};
В этом случае левую часть можно поместить в макрос (в котором также будет генерироваться имя temp), тогда будет вот так:
Здравствуйте, Evgeny.Panasyuk,
а как все-таки решается проблема с использованием в лямдах-обработчиках on_exit локальных имен, объявленных не в начале, а в середине scope?
Здравствуйте, _hum_, Вы писали:
__>а как все-таки решается проблема с использованием в лямдах-обработчиках on_exit локальных имен, объявленных не в начале, а в середине scope?
Если инициализировать перед scope_exit никак нельзя, тогда можно обернуть в boost::optional — то есть лямбда захватит этот optional, а сама инициализация будет в середине scope. Но, ИМХО, это редкая ситуация.