欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++ 实现Golang里的defer

程序员文章站 2022-04-14 19:17:48
不多说了,直接贴代码。就一个hpp文件。 使用方法: 再加个 vs 代码片段 保存为defer.snippet文件,放到C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\Snippets\2052 ......

不多说了,直接贴代码。就一个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的 工具-代码片段管理器 就可以找到。

完毕!!!