>> try {
>> подготовка обстановки;
>> работа;
>> } finally {
>> восстановление обстановки;
>> }
C>Проблема тут в том, что можно забыть добавить нужное
C>cleanup-действие в "восстановление обстановки".
C>В этом отношении RAII намного лучше — мы уже не можем забыть освободить
C>ресурс (ну если _очень_ не захочем).
это как раз ещё один случай, где очень удобны лямбды. вот как это выглядит в хаскеле:
bracket (openFile filename) closeFile \$ handle -> do
x <- readLn handle
...
действие closeFile синтаксически описывается рядом с openFile и будет выполнено над возвращённым хендлом в обоих случаях. более того, это легко выделить в отлельную функцию — это будет аналог вашего служебного класса:
withFile filename = bracket (openFile filename) closeFile
withFile "autoexec.bat" \$ handle -> do
x <- readLn handle
...
плюс к этому, логика try/finally жёстко задана в компиляторе, а при использовании функций/классов в них легкко можно добавить свои погремушки. я например недавно таким образом добавил обработку ^Breal
C>Количество необходимых служебных классов, на практике, у меня получается
C>очень небольшим. ON_BLOCK_EXIT + boost::bind справляются с 90% случаев.
а как выглядит этот код? как я понимаю, те же лямбды, только сахар не такой сладкий?