C++ 实现Golang里的defer
程序员文章站
2022-06-22 11:06:12
不多说了,直接贴代码。就一个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的 工具-代码片段管理器 就可以找到。
完毕!!!
推荐阅读
-
ajax实现点击不同的链接让返回的内容显示在特定div里
-
Python实现字符串的逆序 C++字符串逆序算法
-
[开源]基于goapp+xterm实现webssh-网页上的SSH终端linux管理工具(golang)
-
mssql server 存储过程里,bulk insert table from '路径+文件',路径固定,文件名不固定的实现方法
-
Android里实现退出主程序的提示代码
-
Golang教程之不可重入函数的实现方法
-
golang interface判断为空nil的实现代码
-
golang实现分布式缓存笔记(一)基于http的缓存服务
-
golang实现LRU缓存淘汰算法的示例代码
-
Golang学习笔记之延迟函数(defer)的使用小结