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_(); }
}