В Go есть defer-функции — просто супер-необходимая штука.
Говорят, что и в D тоже есть аналогичное, но я не смотрел.
Работает при выходе из блока, хотя определить можно в любом месте блока.
И вот сегодня наткнулся на scope_exit в С++.
Однако пишут, что experimental пока
Хотя в boost есть.
Кто-нить уже юзал ?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>В Go есть defer-функции — просто супер-необходимая штука. LVV>Говорят, что и в D тоже есть аналогичное, но я не смотрел. LVV>Работает при выходе из блока, хотя определить можно в любом месте блока. LVV>И вот сегодня наткнулся на scope_exit в С++. LVV>Однако пишут, что experimental пока LVV>Хотя в boost есть.
LVV>Кто-нить уже юзал ?
Здравствуйте, 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 обертку (например).
Здравствуйте, LaptevVV, Вы писали:
LVV>В Go есть defer-функции — просто супер-необходимая штука. LVV>Говорят, что и в D тоже есть аналогичное, но я не смотрел. LVV>Работает при выходе из блока, хотя определить можно в любом месте блока. LVV>И вот сегодня наткнулся на scope_exit в С++. LVV>Однако пишут, что experimental пока LVV>Хотя в boost есть.
LVV>Кто-нить уже юзал ?
Если действие ассоциировано с чем-то передаваемым по указателю или ссылке, стараюсь создать guard, ассоциированный с этим указателем.
Тогда нет риска, рассогласования указателя и гуарда при рефакторинге. Можно передать в функцию и т.д.
Здравствуйте, LaptevVV, Вы писали:
LVV>В Go есть defer-функции — просто супер-необходимая штука. LVV>Говорят, что и в D тоже есть аналогичное, но я не смотрел. LVV>Работает при выходе из блока, хотя определить можно в любом месте блока.
При выходе из функции, не из блока. Определять можно где угодно, хоть в цикле, по многу штук.
LVV>И вот сегодня наткнулся на scope_exit в С++. LVV>Однако пишут, что experimental пока LVV>Хотя в boost есть.
В C++ сложно привязать действие к выходу из функции. Но можно привязать к выходу из scope.
Здравствуйте, so5team, Вы писали:
LVV>>В Go есть defer-функции — просто супер-необходимая штука.
S>Там это супер-необходимая штука, потому что в языке нет ни RAII, ни чего-либо вроде try-with-resources/using из Java/C#. S>Короче, авторы Go лепили откровенно убогую и отсталую от современных реалий хрень, поэтому пришлось добавлять костыль чтобы не получилось ну совсем уж уныло.
Гошный defer очень легковесный в плане использования. Просто описываешь нужную функцию по месту. И, в качестве приятного бонуса, оно же с замыканиями, т.е., имеет доступ к локальным переменным.
Здравствуйте, LaptevVV, Вы писали:
LVV>В Go есть defer-функции — просто супер-необходимая штука. LVV>Говорят, что и в D тоже есть аналогичное, но я не смотрел. LVV>Работает при выходе из блока, хотя определить можно в любом месте блока. LVV>И вот сегодня наткнулся на scope_exit в С++.
...
Здравствуйте, LaptevVV, Вы писали:
LVV>Кто-нить уже юзал ?
Я пользую самописное, сделанное по мотивам Folly ScopeGuar.
Раньше пользовался бустовой версией, но вариант от folly мне понравился больше, а тащить его в проект смысла нет — вот и позаимствовал, а затем и расширил для своих нужд и хотелок.
В бусте, на тот момент, в который я перешёл на этот вариант, нужно было в конце писать что-то типа BOOST_SCOPE_END. Не знаю, актуально ли сейчас.
Здравствуйте, LaptevVV, Вы писали:
LVV>И вот сегодня наткнулся на scope_exit в С++. LVV>Однако пишут, что experimental пока LVV>Хотя в boost есть. LVV>Кто-нить уже юзал ?
Не, у меня свой, с красивым синтаксисом:
auto fnOnExit = do_on_exit-->[&result]
{
std::cout << "result = " << result << std::endl;
};