• C++用finally函数实现当前函数运行结束自动执行一段代码


    我们的需求

    可能有这样的需求,

    fun()

    {

            xx;

            xx;

            xx;

            //希望在这里能自动执行一段设定好的代码,实现一些自动清除啥啥啥的操作

    }

    核心思想

    在fun函数开始处,定义一个栈对象,构造函数给它传递要给匿名函数进去初始化该对象,然后fun函数结束,会自动析构这个栈对象。(然而该对象的析构函数,恰好是调用传递进去的这个匿名函数(也叫lambda函数),这样就实现了fun函数结束时候自动执行一段代码啦(这里就是那个匿名函数))。

    那我们开干吧。

    写法

    fun()

    {

        auto action = finally([this]{mXX = false;});

            xx;

            xx;

            xx;

            //这里能自动执行 mXX = false;这个代码

    }

    实现过程

    该栈对象的类,如何定义,如下:

    1. //https://github.com/Microsoft/GSL
    2. //这是一个模板类,相当于传进来的可以是一个函数(相当于注册回调函数),也可以是其它内容
    3. template <class F>
    4. class final_action
    5. {
    6. public:
    7. static_assert(!std::is_reference::value && !std::is_const::value &&
    8. !std::is_volatile::value,
    9. "Final_action should store its callable by value");
    10. //构造函数,传进来的东西,比如函数,就会赋值给自己的成员 F f_;
    11. explicit final_action(F f) noexcept : f_(std::move(f)) {}
    12. final_action(final_action&& other) noexcept
    13. : f_(std::move(other.f_)), invoke_(other.invoke_)
    14. {}
    15. final_action(const final_action&) = delete;
    16. final_action& operator=(const final_action&) = delete;
    17. final_action& operator=(final_action&&) = delete;
    18. //析构函数时候,就调用f_()函数,也就是构造函数时候传进来的那个函数了喔
    19. ~final_action() noexcept
    20. {
    21. if (invoke_) f_();
    22. }
    23. private:
    24. F f_;
    25. bool invoke_{true};
    26. };
    27. template <class F> final_action<typename std::remove_cv<typename std::remove_reference::type>::type>
    28. finally(F&& f) noexcept
    29. {
    30. return final_action<typename std::remove_cv<typename std::remove_reference::type>::type>(
    31. std::forward(f));
    32. }

    我们的fun函数写法如下:

    1. void Main::fun()
    2. {
    3. mA = 1;
    4. //匿名函数内容: [this]{mA = 9;}
    5. //action就是finally构造出的对象(我们不需要使用到这个对象,因为以及可以让它自动析构即可)
    6. auto action = finally([this]{
    7. mA = 9;
    8. });
    9. mA = 2;
    10. mA = 3;
    11. mA = 4;
    12. //这里action对象会被析构了,会自动执行 mA = 9;
    13. }

    参考文章:

    关于c ++:依靠RVO最终功能 | 码农家园

    C++匿名函数_co16zero的博客-CSDN博客_c++匿名函数

  • 相关阅读:
    高质量发展项目——冠心病药物治疗管理标准化培训在京顺利举办
    Vivado 2017.04版本安装教程
    STM32在STM32CubeIDE平台下的RT-Thread Nano移植
    java基于SpringBoot+Vue+nodejs的在线外卖订餐系统Element
    Arduino从零开始(1)——按钮控制LED
    移动端开发
    从技术走向管理
    Redis 持久化 - RDB 与 AOF
    卷积神经网络实现咖啡豆分类 - P7
    matlab绘制动图
  • 原文地址:https://blog.csdn.net/kangkanglhb88008/article/details/126050031