不多说了,直接贴代码。就一个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的更多相关文章

  1. golang学习之defer

    golang中的defer通常用于执行一些资源释放性操作,比如open/close.connect/disconnect.lock/unlock等,对defer理解主要记住以下三点: 1.defer ...

  2. golang中的defer

    1.defer的作用 defer 语句会将函数推迟到外层函数返回之后执行. 即defer后面的函数在defer语句所在的函数执行结束的时候会被调用 2.defer的语法 defer后面必须是函数调用语 ...

  3. 【GoLang】panic defer recover 深入理解

    唉,只能说C程序员可以接受go的错误设计,相比java来说这个设计真的很差劲! 我认为知乎上说的比较中肯的: 1. The key lesson, however, is that errors ar ...

  4. golang 详解defer

    什么是defer defer用来声明一个延迟函数,把这个函数放入到一个调用链表上, 当外部的包含方法return之前,返回参数到调用方法之前调用,也可以说是运行到最外层方法体的"}" ...

  5. <script>标签里的defer和async属性 区别(待补充)

    defer与async的区别(表格显示): table th:first-of-type { width: 150px; } table th:nth-of-type(2) { } 区别 defer ...

  6. script标签里的defer属性

    入职新公司,看代码的时候注意到有的script标签中有一个defer属性,查了一下.在这里分享出来. 需要注意的有三点,其中前两点是在错误中分辨出来的: 错误来源:http://www.w3schoo ...

  7. [Golang]一道考察defer与命名返回值的题目

    题目 输出: 4 1 3 解释 当函数有可命名结果形参时,结果形参的初始值被设置为零值,函数的return语句会设置结果形参的值 当函数有可命名结果形参时,defer函数是可以修改它,然后再将它的值返 ...

  8. Golang里实现Http服务器并解析header参数和表单参数

    在http服务里,header参数和表单参数是经常使用到的,本文主要是练习在Go语言里,如何解析Http请求的header里的参数和表单参数,具体代码如下: package server import ...

  9. Golang 笔记 4 defer、error、panic

    一.defer语句 defer语句仅能被放置在函数或方法中.它由关键字defer和一个调用表达式组成.这里的表达式所表示的既不能是对Go语言内建函数的调用也不能是对Go语言标准库代码包unsafe中的 ...

随机推荐

  1. FFmpeg将多张图片合成视频 子视频合并

    FFmpeg将多张图片合成视频 - CSDN博客 https://blog.csdn.net/wangshuainan/article/details/77914508 Slideshow – FFm ...

  2. qq xxs

    qq xxs qq xxs 有很多举个简单例子 : QQ空间发段文章 带上 <script> 提交(document.cookie) 到 自己服务端获取 </script> 在 ...

  3. java连接Oracle案例

    首先来讲一下桥连接: 首先配置数据源:打开控制面板——管理工具——数据源(ODBC)——用户DSN——添加——找到Oracle驱动程序. //JDBC-ODBC桥连接public class Conn ...

  4. 基于Jquery插件Uploadify实现实时显示进度条上传图片

    网址:http://www.jb51.net/article/83811.htm     这篇文章主要介绍了基于Jquery插件Uploadify实现实时显示进度条上传图片的相关资料,感兴趣的小伙伴们 ...

  5. centOS封装

    前言 在实际工作中,CentOS的安装需要设置的语言.键盘模式.时区等信息都存在很大程度上的雷同型.并且,安装完成后的一些设置工作也都是一样的.这些工作都可以在安装操作系统的时候自动完成.最终做到,安 ...

  6. sql的where条件中包含中文,查询不出来的处理方法

    SELECT  * FROM phonenumber_info where PROVANCE=N'广东' and  CITY=N'中山市'

  7. Connection: close和Connection: keep-alive有什么区别?

    看到有人问Connection: close和Connection: keep-alive有什么区别?想起以前学习到的一篇文章,今天转载来,大家看看,我也再温故知新下.如果有问题补充的在下面可以扩充下 ...

  8. bzoj 1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏【模拟】

    模拟 #include<iostream> #include<cstdio> using namespace std; int n,ans; int main() { scan ...

  9. React实战之60s倒计时按钮(发送短信验证按钮)

    React实战之60s倒计时按钮——短信验证按钮 导入:(antd组件——Form表单) import { Button, Form, Input } from 'antd'; const FormI ...

  10. 二分搜索 HDOJ 2675 Equation Again

    题目传送门 /* 二分搜索:式子两边取对数,将x提出来,那么另一边就是一个常数了,函数是:lnx/x.二分搜索x,注意要两次 */ #include <cstdio> #include & ...