scope_exit кто-нить юзал ?
От: LaptevVV Россия  
Дата: 14.01.26 04:42
Оценка:
В Go есть defer-функции — просто супер-необходимая штука.
Говорят, что и в D тоже есть аналогичное, но я не смотрел.
Работает при выходе из блока, хотя определить можно в любом месте блока.
И вот сегодня наткнулся на scope_exit в С++.
Однако пишут, что experimental пока
Хотя в boost есть.

Кто-нить уже юзал ?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Отредактировано 14.01.2026 4:43 LaptevVV . Предыдущая версия .
Re: scope_exit кто-нить юзал ?
От: Doom100500 Израиль  
Дата: 14.01.26 07:42
Оценка: +2
Здравствуйте, LaptevVV, Вы писали:

LVV>В Go есть defer-функции — просто супер-необходимая штука.

LVV>Говорят, что и в D тоже есть аналогичное, но я не смотрел.
LVV>Работает при выходе из блока, хотя определить можно в любом месте блока.
LVV>И вот сегодня наткнулся на scope_exit в С++.
LVV>Однако пишут, что experimental пока
LVV>Хотя в boost есть.

LVV>Кто-нить уже юзал ?


std::shared_ptr<void> defer(nullptr, [&](auto) 
    {
        // cleanup
    });


Спасибо за внимание
Re: scope_exit кто-нить юзал ?
От: so5team https://stiffstream.com
Дата: 14.01.26 08:12
Оценка: 17 (2) +2
Здравствуйте, LaptevVV, Вы писали:

LVV>В Go есть defer-функции — просто супер-необходимая штука.


Там это супер-необходимая штука, потому что в языке нет ни RAII, ни чего-либо вроде try-with-resources/using из Java/C#.
Короче, авторы Go лепили откровенно убогую и отсталую от современных реалий хрень, поэтому пришлось добавлять костыль чтобы не получилось ну совсем уж уныло.

LVV>Говорят, что и в D тоже есть аналогичное, но я не смотрел.


Есть, причем там есть варианты по типу выхода из блока -- всегда, только если нет ошибок, только если выход из-за исключения. См.https://tour.dlang.org/tour/en/gems/scope-guards
Но и здесь есть своя специфика связанная с тем, что RAII в языках с GC и ссылочными типами -- это не тоже самое, что в C++.

При этом в scope(failure) есть свой смысл временами. Тогда как scope(success), скорее, для симметрии существует.

LVV>Кто-нить уже юзал ?


Время от времени используется самописный аналог finally из GSL. Но, как правило, в ситуациях, когда лень городить RAII обертку (например).
Re: scope_exit кто-нить юзал ?
От: Chorkov Россия  
Дата: 14.01.26 08:40
Оценка: 15 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>В Go есть defer-функции — просто супер-необходимая штука.

LVV>Говорят, что и в D тоже есть аналогичное, но я не смотрел.
LVV>Работает при выходе из блока, хотя определить можно в любом месте блока.
LVV>И вот сегодня наткнулся на scope_exit в С++.
LVV>Однако пишут, что experimental пока
LVV>Хотя в boost есть.

LVV>Кто-нить уже юзал ?


Если действие ассоциировано с чем-то передаваемым по указателю или ссылке, стараюсь создать guard, ассоциированный с этим указателем.
Тогда нет риска, рассогласования указателя и гуарда при рефакторинге. Можно передать в функцию и т.д.

    template<typename T/*=QObject*/>
    auto blockSignalsTemporary(T* ptr)
    {
        static_assert(( std::is_base_of_v< QObject, T > ));
        bool blocked = ptr->blockSignals(true);
        auto on_exit = [blocked](T*ptr) {  ptr->blockSignals(blocked); };
        return std::unique_ptr<T, decltype(on_exit) >(ptr, on_exit);
    }
...
    blockSignalsTemporary(widget)->setValue( 42 );


scope_fail/scope_success — не потребовались, хотя я о них знаю.
Re: scope_exit кто-нить юзал ?
От: sergii.p  
Дата: 14.01.26 10:57
Оценка: 1 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Кто-нить уже юзал ?


~scope_exit() noexcept;


void foo() {
    auto guard = std::experimental::scope_exit{[](){ throw 1; }};
} // UB


Наверное поэтому оно до сих пор и experimental.
В Go эта проблема отсутствет. Нет исключений — нет проблем.
Re: scope_exit кто-нить юзал ?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.01.26 11:21
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Работает при выходе из блока, хотя определить можно в любом месте блока.


Нужно, чтоб работало непременно после выхода из блока (в охватывающем блоке)?
Re[2]: scope_exit кто-нить юзал ?
От: so5team https://stiffstream.com
Дата: 14.01.26 11:43
Оценка: +1
Здравствуйте, sergii.p, Вы писали:

SP>
SP>void foo() {
SP>    auto guard = std::experimental::scope_exit{[](){ throw 1; }};
SP>} // UB
SP>


А разве исключение из noexcept метода/функции -- это UB?
Вроде бы гарантируется, что процесс, в котором такое произошло, терминируется.
Re: scope_exit кто-нить юзал ?
От: Pzz Россия https://github.com/alexpevzner
Дата: 14.01.26 13:24
Оценка: 15 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>В Go есть defer-функции — просто супер-необходимая штука.

LVV>Говорят, что и в D тоже есть аналогичное, но я не смотрел.
LVV>Работает при выходе из блока, хотя определить можно в любом месте блока.

При выходе из функции, не из блока. Определять можно где угодно, хоть в цикле, по многу штук.

LVV>И вот сегодня наткнулся на scope_exit в С++.

LVV>Однако пишут, что experimental пока
LVV>Хотя в boost есть.

В C++ сложно привязать действие к выходу из функции. Но можно привязать к выходу из scope.
Re[2]: scope_exit кто-нить юзал ?
От: Pzz Россия https://github.com/alexpevzner
Дата: 14.01.26 13:26
Оценка:
Здравствуйте, so5team, Вы писали:

LVV>>В Go есть defer-функции — просто супер-необходимая штука.


S>Там это супер-необходимая штука, потому что в языке нет ни RAII, ни чего-либо вроде try-with-resources/using из Java/C#.

S>Короче, авторы Go лепили откровенно убогую и отсталую от современных реалий хрень, поэтому пришлось добавлять костыль чтобы не получилось ну совсем уж уныло.

Гошный defer очень легковесный в плане использования. Просто описываешь нужную функцию по месту. И, в качестве приятного бонуса, оно же с замыканиями, т.е., имеет доступ к локальным переменным.
Re[3]: scope_exit кто-нить юзал ?
От: so5team https://stiffstream.com
Дата: 14.01.26 13:33
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Гошный defer очень легковесный в плане использования.


Продолжайте держать в курсе, это очень, очень важная информация.
Re[2]: scope_exit кто-нить юзал ?
От: T4r4sB Россия  
Дата: 14.01.26 17:24
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>~scope_exit() noexcept


Это чё, в смысле? Деструкторы теперь тоже надо поменять noexcept? А зачем, разве они бывают не noexcept?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re: scope_exit кто-нить юзал ?
От: Alexander_S_U https://github.com/alexanders-code/cmdxmlinstaller
Дата: 14.01.26 20:16
Оценка: 15 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>В Go есть defer-функции — просто супер-необходимая штука.

LVV>Говорят, что и в D тоже есть аналогичное, но я не смотрел.
LVV>Работает при выходе из блока, хотя определить можно в любом месте блока.
LVV>И вот сегодня наткнулся на scope_exit в С++.
...

Можно попробовать такой аналог Scope Guard and Defer C++
Или Аналог scope(exit) на С++
https://github.com/alexanders-code/cmdxmlinstaller
Re: scope_exit кто-нить юзал ?
От: serg_joker Украина  
Дата: 14.01.26 20:51
Оценка: 15 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Кто-нить уже юзал ?


Я пользую самописное, сделанное по мотивам Folly ScopeGuar.
Раньше пользовался бустовой версией, но вариант от folly мне понравился больше, а тащить его в проект смысла нет — вот и позаимствовал, а затем и расширил для своих нужд и хотелок.
В бусте, на тот момент, в который я перешёл на этот вариант, нужно было в конце писать что-то типа BOOST_SCOPE_END. Не знаю, актуально ли сейчас.
Re: scope_exit кто-нить юзал ?
От: B0FEE664  
Дата: 16.01.26 16:22
Оценка: 15 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>И вот сегодня наткнулся на scope_exit в С++.

LVV>Однако пишут, что experimental пока
LVV>Хотя в boost есть.
LVV>Кто-нить уже юзал ?

Не, у меня свой, с красивым синтаксисом:
    auto fnOnExit = do_on_exit-->[&result]
    {
        std::cout << "result = " << result << std::endl;
    };


Уже почти 11 лет как использую
Автор: B0FEE664
Дата: 23.03.15

Это мне Evgeny.Panasyuk подсказал здесь
Автор: Evgeny.Panasyuk
Дата: 19.03.15


Единственно, что с тех пор пришлось пустой метод добавить DisableUnusedVariableWarning()
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.