超簡単scope_guard
struct scope_guard { std::function<void()> f_; bool dismiss_ = false; template<typename F> scope_guard(F && f) : f_(std::forward<F>(f)) {} scope_guard() = delete; scope_guard(scope_guard const &) = delete; ~scope_guard() { if (!dismiss_) { f_(); } } void dismiss() { dismiss_ = true; } }; void f() { scope_guard guard1 = [] { std::cout << "これはfを抜けるときに必ず実行されるよ!" << std::endl; } g(); scope_guard guard2 = [] { std::cout << "g()が例外投げてたら、guard2ができる前に関数が終了するからここには到達しないよ!" << endl; } }
functionとかの実装にもよるけど、小さい関数オブジェクトなら内部にコピーされるはず。でかい関数オブジェクトは動的確保された領域に作られるだろうけど、基本的にそんな関数オブジェクトをscope_guardでは使わないだろうし、だったらもうこれで十分じゃないでしょうか的な。