当前位置:   article > 正文

使用C++11实现Golang的defer功能

使用C++11实现Golang的defer功能

本文主要用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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

调用代码片段如下:

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());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

编译示例:

g++ -std=c++1y -Wall main.cpp 
  • 1

输出结果如下:

goodbye
mydefer 11111
mydefer 22222
mydefer 0000
  • 1
  • 2
  • 3
  • 4

小结

作为业务使用者,本着拿来主义的精神,直接上述代码就能实现功能。限于精力,不再深入研究C++的特性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/615032
推荐阅读
相关标签
  

闽ICP备14008679号