WhenLeaveDo
我相當討厭 goto,幾乎不用它。常見的 goto 用法是把清理資源的程式碼放到函數尾端,程式執行過程一遇到問題,就 goto 到該資源清理區,然後離開。
這是很常見的需求,我希望利用 C++ 語言特性來實作,需求如下:
- 待清理的「資源」不固定
- 函數跳離前(包含 Exception)需保證資源被清理
WhenLeaveDo 的用法:
WhenLeaveDo cleanup([]()
{
// Cleanup code.
});
實作
template <typename Task>
class WhenLeaveDo {
WhenLeaveDo(Task t) : task_{t} {}
~WhenLeaveDo() { if (task_) task_(); }
}