C++ 实现Golang里的defer
不多说了,直接贴代码。就一个hpp文件。
1 #include <functional>
2
3 #define CONCAT_(a, b) a##b
4 #define CONCAT(a, b) CONCAT_(a,b)
5 /*
6 eg. defer(代码); 注意后面 一定要加上 ;
7 */
8
9 #define defer(code) DeferOp CONCAT(_defer_, __LINE__) = [&](){code}
10
11 class DeferOp
12 {
13 public:
14 DeferOp(std::function<void()>&& fn)
15 : m_fun(std::move(fn))
16 {}
17 ~DeferOp()
18 {
19 if (nullptr != m_fun)
20 {
21 m_fun();
22 }
23 }
24
25 #if _MSC_VER >= 1700 //VS2012
26 DeferOp(DeferOp &&other) = delete;
27 DeferOp(const DeferOp&) = delete;
28 void operator=(const DeferOp &) = delete;
29 #else
30 DeferOp(DeferOp &&other);
31 DeferOp(const DeferOp&);
32 void operator=(const DeferOp &);
33 #endif
34 protected:
35 std::function<void()> m_fun;
36 };
使用方法:
1 {
2 defer
3 (
4 //代码
5 );
6 }
再加个 vs 代码片段
1 <?xml version="1.0" encoding="utf-8"?>
2 <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
3 <CodeSnippet Format="1.0.0">
4 <Header>
5 <Title>defer</Title>
6 <Shortcut>defer</Shortcut>
7 <Description>延迟的代码片段</Description>
8 <Author>bin432</Author>
9 <SnippetTypes>
10 <SnippetType>Expansion</SnippetType>
11 <SnippetType>SurroundsWith</SnippetType>
12 </SnippetTypes>
13 </Header>
14 <Snippet>
15 <Declarations>
16 <Literal>
17
18 </Literal>
19 </Declarations>
20 <Code Language="cpp"><![CDATA[defer
21 (
22 $selected$ $end$
23 );]]>
24 </Code>
25 </Snippet>
26 </CodeSnippet>
27 </CodeSnippets>
保存为defer.snippet文件,放到C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\Snippets\2052\Visual C++目录。
这个目录可以在vs的 工具-代码片段管理器 就可以找到。
完毕!!!
C++ 实现Golang里的defer的更多相关文章
- golang学习之defer
golang中的defer通常用于执行一些资源释放性操作,比如open/close.connect/disconnect.lock/unlock等,对defer理解主要记住以下三点: 1.defer ...
- golang中的defer
1.defer的作用 defer 语句会将函数推迟到外层函数返回之后执行. 即defer后面的函数在defer语句所在的函数执行结束的时候会被调用 2.defer的语法 defer后面必须是函数调用语 ...
- 【GoLang】panic defer recover 深入理解
唉,只能说C程序员可以接受go的错误设计,相比java来说这个设计真的很差劲! 我认为知乎上说的比较中肯的: 1. The key lesson, however, is that errors ar ...
- golang 详解defer
什么是defer defer用来声明一个延迟函数,把这个函数放入到一个调用链表上, 当外部的包含方法return之前,返回参数到调用方法之前调用,也可以说是运行到最外层方法体的"}" ...
- <script>标签里的defer和async属性 区别(待补充)
defer与async的区别(表格显示): table th:first-of-type { width: 150px; } table th:nth-of-type(2) { } 区别 defer ...
- script标签里的defer属性
入职新公司,看代码的时候注意到有的script标签中有一个defer属性,查了一下.在这里分享出来. 需要注意的有三点,其中前两点是在错误中分辨出来的: 错误来源:http://www.w3schoo ...
- [Golang]一道考察defer与命名返回值的题目
题目 输出: 4 1 3 解释 当函数有可命名结果形参时,结果形参的初始值被设置为零值,函数的return语句会设置结果形参的值 当函数有可命名结果形参时,defer函数是可以修改它,然后再将它的值返 ...
- Golang里实现Http服务器并解析header参数和表单参数
在http服务里,header参数和表单参数是经常使用到的,本文主要是练习在Go语言里,如何解析Http请求的header里的参数和表单参数,具体代码如下: package server import ...
- Golang 笔记 4 defer、error、panic
一.defer语句 defer语句仅能被放置在函数或方法中.它由关键字defer和一个调用表达式组成.这里的表达式所表示的既不能是对Go语言内建函数的调用也不能是对Go语言标准库代码包unsafe中的 ...
随机推荐
- 爬虫定时任务 redis 减轻 mysql 读的压力 加层
非工作时间,定时任务爬虫大量mysq短链接,影响了其他业务的,mysql 报 too many connections 错误 将爬虫url池放入到redis中,单独的脚本维护redis url池的更 ...
- 记一次ORA-600[13011]
SunOS 5.10 Oracle 10.2.0.2.0 开发环境某一数据库出现ora-600报错. alert.log中的报错信息: Thu Nov 13 15:11:43 2014 Errors ...
- 同一个站点下,兼容不同版本的JQuery
https://stackoverflow.com/questions/1566595/can-i-use-multiple-versions-of-jquery-on-the-same-page Y ...
- 分享一个全开源的ASP.NET快速开发平台,能快速开发OA CRM ERP 等系统
bingo炸了 2017/3/30 16:28:14 阅读(870) 评论(0) 公司业务量比较大,接了很多项目,为了缩短开发周期老板让我牵头搭建了一个快速开发平台. 我们主要的业务是做OA.CRM. ...
- POJ2208 Pyramids 四面体体积
POJ2208给定四面体六条棱(有序)的长度 求体积 显然用高中立体几何的方法就可以解决. 给出代码 #include<iostream> #include<cstdio> # ...
- RDA 多屏参流程
一.RDA MAKEFILE的本地变量 在介绍多屏参之前,先看一下./code/env.conf的包含过程,通过./code/Makefile.project加载,env.conf中所有的变量,都变为 ...
- SQL 存储过程语句拼接愁人的时间类型
http://www.cnblogs.com/yrup/p/4201329.html 解决方法: Select CONVERT(varchar(100), GETDATE(), 25): 2006-0 ...
- python自动化学习笔记11-自动化测试UTP框架
前面基本的unittest及ddt已经学过了,现在我们系统把这些知识结合起来,写一个简单的UTP自动化测试框架: 我们先来建基础目录,首先新建一个项目,项目下建父目录UTP,conf目录,用来存放配置 ...
- CF482C Game with Strings
题意 你和你的朋友玩一个游戏,游戏规则如下. 你的朋友创造 n 个长度均为 m 的不相同的字符串,然后他随机地选择其中一个.他选择这些字符串的概率是相等的,也就是说,他选择 n 个字符串中的每一个的概 ...
- 6.12---bug