LINUX.ORG.RU

c++ scoped function

 


0

4

как в с++ вызвать функцию после выхода из блока? вызов должен быть в любом случае(return и exception). Есть что-то стандартное? или только самописный класс с соответствующим деструктором; дублирование вызова в catch(...)?


Насколько я знаю, единственное действие, автоматически происходящее при выходе из блока, это вызов деструкторов. Соответственно об этом и есть RAII. Подозреваю, что тебе надо ресурс освобождать в независимости от того, удалось что-то, или выскочило исключение - используй RAII, Люк.

hlebushek ★★
()
Ответ на: комментарий от hlebushek

мне не надо освобождать ресурс, иначе бы воспользовался интеллектуальным указателем. нужно вызвать функцию. можно конечно ее завернуть через свой deleter в unique_ptr, но проще в обычном деструкторе вызвать

kasha
() автор топика

1. Если есть буст, можно взять его SCOPE_EXIT

2. Если буста нет, напиши сам, это одна строчка. Две, чтобы сделать дженерик, три, чтобы сделать реюзабельный макрос.

3. Некоторые извращенцы умудряются пользоваться для этого кастомным deleter'ом в умных указателях C++11.

P.S. Не забудь, что из деструктора (в т.ч. RAII) нельзя бросать исключения. Если твоя функция может их бросать - либо оберни её в catch(...), либо пересмотри свою архитектуру.

E ★★★
()

Если используешь boost, то там есть BOOST_SCOPE_EXIT

Amp ★★★
()

вызов должен быть в любом случае(return и exception).

В смысле, хочешь обязательно бросить исключение или это означает вызвать и опцилнально бросить исключение?

mashina ★★★★★
()
Ответ на: комментарий от mashina

В C++ можно вообще всё, что душе угодно, но выражение «выстрелить себе в ногу» почему-то ни в одном другом языке не прижилось.

E ★★★
()
Ответ на: комментарий от E

но выражение «выстрелить себе в ногу» почему-то ни в одном другом языке не прижилось.

Может потому-что это выражение, внезапно, принадлежит Страуструпу?

anonymous
()

Можно пример, когда такое вообще может понадобиться и при этом это одноразовое действие (то есть когда, RAII-класс-обертка оверкилл).

Kuzy ★★★
()
Последнее исправление: Kuzy (всего исправлений: 1)
Ответ на: комментарий от mashina

Зачем паниковал? Я успешно этими возможностями пользуюсь в т.ч. в продакшне, если очень-очень хочется. Всё работает, как часы, юнит-тесты зелёные. Но я-то знаю, как эти фичи работают, а новички - не знают. «Можно, но аккуратно» - это точно не для них совет.

E ★★★
()
Ответ на: комментарий от Kuzy

так этот класс писать нужно, я спрашиваю есть ли уже написанное стандартное, что передал функцию и она вызовется

kasha
() автор топика
Ответ на: комментарий от kasha

Ты можешь везде писать:

directory temp {gen_name()};
on_scope_end([&temp] { temp.delete(); });

А можешь:

temp_directory temp;

Использование первого варианта можно обосновать только тем, что лень писать обертку. В остальном, второй вариант всем лучше.

Мне интересно, если ли случаи, когда второй вариант хуже.

Kuzy ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.