多くの人は間違いなく、Alexandrescus 氏の ScopeGuard テンプレート (現在は Loki の一部) と、ここで紹介されている新しいバージョンの ScopeGuard11 に精通しています: http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012- Andrei-Alexandrescu-Systematic-Error-Handling-in-C
ソースはこちら: https://gist.github.com/KindDragon/4650442
2012 年以降の c++ での講演で、彼は、例外が原因でスコープが終了したかどうかを正しく検出する方法を見つけることができなかったと述べました。したがって、彼は、例外のためにスコープが終了した場合にのみ、提供されたラムダ (通常はロールバック コードに使用される) を実行する SCOPE_FAIL マクロを実装できませんでした。これにより、dismiss() メンバー関数が不要になり、コードが読みやすくなります。
私は Alexandrescu 氏ほど天才でも経験豊富でもないので、SCOPE_FAIL の実装はこれほど簡単ではないと思います。
~ScopeGuard11(){ //destructor
if(std::uncaught_exception()){ //if we are exiting because of an exception
f_(); //execute the functor
}
//otherwise do nothing
}
私の質問は、なぜですか?