赞
踩
本文主要用C++11标准来实现Golang的defer功能。
目前笔者的主力语言是Golang,其次是C++,再次是JS、Delphi。在Golang工程中大量使用了defer关键字实现函数的延迟调用。如打开文件的出错处理。近来在C++工程中遇到类似需求,在函数返回时进行某次处理,但函数返回的地方较多,如在返回之前一一写上,略稍麻烦,幸好早有人实现了。
网上的实现方法有很多种,这篇文章中的方法是比较简洁的。代码量不多,就直接抄录在此:
/* https://www.gingerbill.org/article/2015/08/19/defer-in-cpp/ 使用: defer ({ printf("defer 0000\n"); }); defer (foobar()); c++11及以上标准 */ #ifndef _MYHEAD_H #define _MYHEAD_H template <typename F> struct privDefer { F f; privDefer(F f) : f(f) {} ~privDefer() { f(); } }; template <typename F> privDefer<F> defer_func(F f) { return privDefer<F>(f); } #define DEFER_1(x, y) x##y #define DEFER_2(x, y) DEFER_1(x, y) #define DEFER_3(x) DEFER_2(x, __COUNTER__) #define mydefer(code) auto DEFER_3(_defer_) = defer_func([&](){code;}) #endif
调用代码片段如下:
void defer_func() { printf("goodbye\n"); } void defer_test() { mydefer ({ printf("mydefer 0000\n"); }); mydefer ({ printf("mydefer 11111\n"); printf("mydefer 22222\n"); }); mydefer (defer_func()); }
编译示例:
g++ -std=c++1y -Wall main.cpp
输出结果如下:
goodbye
mydefer 11111
mydefer 22222
mydefer 0000
作为业务使用者,本着拿来主义的精神,直接上述代码就能实现功能。限于精力,不再深入研究C++的特性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。