Defer 與自訂 Deleter
目標:離開 scope 時自動 fclose。
std::unique_ptr + deleter
cpp
std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(path, "r"), &fclose);
if (!fp) { /* 開檔失敗 */ }- 型別是
FILE不是FILE* unique_ptr為空時不會呼叫 deleter,fopen失敗也安全
自製 Defer
cpp
struct Defer {
template <typename F>
explicit Defer(F&& f) : func_(std::forward<F>(f)) {}
~Defer() { func_(); }
Defer(const Defer&) = delete;
Defer& operator=(const Defer&) = delete;
private:
std::function<void()> func_;
};
Defer d([&] { fclose(fp); });std::function 可以吃 lambda、std::bind、function pointer。