c++常用工具之 SCOPE_GUARD

// defer.hpp
#pragma once

#include <functional>

namespace toolkit {
class scope_exit {
  public:
    scope_exit() = default;

    scope_exit(const scope_exit&)            = delete;
    scope_exit& operator=(const scope_exit&) = delete;

    scope_exit(scope_exit&&)            = default;
    scope_exit& operator=(scope_exit&&) = default;

    template <typename F, typename... Args>
    scope_exit(F&& f, Args&&... args)
    {
        func_ = std::bind(std::forward<F>(f), std::forward<Args>(args)...);
    }

    ~scope_exit()
    {
        if (func_) {
            func_();
        }
    }

  private:
    using Callable = std::function<void()>;
    Callable func_;
};
}  // namespace toolkit

#define _CONCAT(__x, __y) __x##__y
#define _MAKE_SCOPE(__x)  toolkit::scope_exit _CONCAT(defer, __x) = [&]()
#define SCOPE_GUARD       _MAKE_SCOPE(__LINE__)

使用:

// main.cpp
#include <iostream>
#include <string>
#include "defer.hpp"


int main(int argc, char** argv)
{
    void* foo = (void*)malloc(10);
    SCOPE_GUARD
    {
        std::cout << "free" << std::endl;
        free(foo);
    };

    void* foo1 = (void*)malloc(10);
    SCOPE_GUARD
    {
        std::cout << "free" << std::endl;
        free(foo1);
    };
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值