Здравствуйте, Sm0ke, Вы писали:
S>Что мне это даст? Я должен решить вызывать ли метод unset() у m_target или нет. Но это будет известно только когда clear() отработает до конца.
Даст возможность отдельно обработать ситуацию, когда что-то вылетело из clear
template<typename Callable>
class my_scope_failure_guard{
Callable _ftn;
int _cnt;
public:
my_scope_failure_guard(Callable f):_ftn(f), _cnt(std::uncaught_exceptions()){}
~my_scope_failure_guard()
{
if(std::uncaught_exceptions() > _cnt ) _ftn();
}
};
~MySmartyPtr()
{
try{
//здесь не важно, пришли мы сюда, раскручивая стек или просто при вызове деструктора,
//можно снова кидать
{
my_scope_failure_guard guard([&](){unset();});
clear();
//лямда вызовется здесь, только если исключение вылетело из clear().
}
//здесь еще можно кидать
}
catch(...)
{
}
}