首页 > 编程语言 >C++用finally函数实现当前函数运行结束自动执行一段代码

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

时间:2023-01-01 11:34:10浏览次数:68  
标签:mA 函数 xx C++ fun finally action final


我们的需求

可能有这样的需求,

fun()

{

        xx;

        xx;

        xx;

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

}

核心思想

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

那我们开干吧。

写法

fun()

{


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


        xx;

        xx;

        xx;

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

}

实现过程

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

//https://github.com/Microsoft/GSL

//这是一个模板类,相当于传进来的可以是一个函数(相当于注册回调函数),也可以是其它内容
template <class F>
class final_action
{
public:
static_assert(!std::is_reference<F>::value && !std::is_const<F>::value &&
!std::is_volatile<F>::value,
"Final_action should store its callable by value");

//构造函数,传进来的东西,比如函数,就会赋值给自己的成员 F f_;
explicit final_action(F f) noexcept : f_(std::move(f)) {}

final_action(final_action&& other) noexcept
: f_(std::move(other.f_)), invoke_(other.invoke_)
{}

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

//析构函数时候,就调用f_()函数,也就是构造函数时候传进来的那个函数了喔
~final_action() noexcept
{
if (invoke_) f_();
}

private:
F f_;
bool invoke_{true};
};

template <class F> final_action<typename std::remove_cv<typename std::remove_reference<F>::type>::type>
finally(F&& f) noexcept
{
return final_action<typename std::remove_cv<typename std::remove_reference<F>::type>::type>(
std::forward<F>(f));
}

我们的fun函数写法如下:

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

参考文章:

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

​​C++匿名函数_co16zero的博客-c++匿名函数​​


标签:mA,函数,xx,C++,fun,finally,action,final
From: https://blog.51cto.com/u_13682052/5982850

相关文章

  • 函数入门
    函数的作用:函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段。定义一个函数函数代码块以def关键词开头,后接函数标识符名称和圆括号()。任何传入参数......
  • C++11:引用限定符
    C++中有左值和右值的概念。其实,左值和右值的区分也同样适用于类对象,本文中将左值的类对象称为左值对象,将右值的类对象称为右值对象。1.C++11:引用限定符默认情况下,对于......
  • P2398 GCD SUM——欧拉函数
    此题可以拓展为\(\sum\limits^n_{i=1}\sum\limits^m_{j=1}\gcd(i,j)\)结论是\(\sum\limits^{\min(n,m)}_{d=1}\varphi(d)\lfloor\dfrac{n}{d}\rfloor\lfloor\dfrac{m}{......
  • ISO C++ forbids taking the address of an unqualified or parenthesized non-static
    //model/util.h#pragmaonce#ifndef__util_h__#define__util_h__#include<chrono>#include<ctime>#include<fstream>#include<iomanip>#include<iostream>......
  • printf函数
    1.语法​printf("HappyNewYear");   printf("%d",a);printf的语法及其简单将要打印的内容用引号括起来即可;如果使用了格式说明符,引号后敲出列表名用","隔开;2.格式说明......
  • 计挑-国赛-C++-5题
    这跟前面做的蓝桥杯省赛-积木画一个类型,但是递推更简单些凭什么,同样是第五题,这跟Java那边都不是一个难度的#include<iostream>#include<vector>usingnamespacestd;......
  • vscode 上创建 c/c++ 工程
    以win10x64系统为例:首先下载并安装vscode和mingw,其中这个mingw的原版编译器是个在线安装包,由于网络被墙安装会非常慢,甚至经常会出现安装中途失败的情况,因此我将以往......
  • 漫谈C++内存和OpenGL各种缓冲对象(上)
    1、C++内存管理(1)常用数据类型占用内存大小:char1字节;int4字节;short2字节;long4字节;bool1字节;float4字节;double8字节;(2)堆栈的比较 [1]堆用于动态分配内存,容量大于......
  • sqlserver 获取汉字拼音的首字母(大写)函数
    USE[test]GO/******对象:UserDefinedFunction[dbo].[GetFirstChar]脚本日期:02/22/201916:39:06******/SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONG......
  • Python__19--函数调用的参数传递与变量的作用域
    1函数调用的参数传递形参(形式参数):在函数定义的时候用到的参数没有具体值,只是一个占位的符号,成为形参;实参(实际参数):在调用函数的时候输入的值。实际参数和形式参......