模仿 Go defer 的C++实现
简单实现
在类中存储函数指针,在析构函数中调用这个函数即可
// 不可靠基类 //继承这个类的类将无法拷贝
struct noncopy{
protected:
noncopy() = default ; //保证空构造存在
noncopy(const noncopy&) = delete ; //删除拷贝函数
noncopy& operator=(const noncopy&) = delete ; //删除等于拷贝函数
};
//defer
template<class F>
struct Defer : noncopy{
Defer(const F& defer_callback):__defer_callback(std::ref(defer_callback)){}
~Defer(){__defer_callback();}
const F& deferCallback() const {return __defer_callback;}
void setDeferCallback(const F& defer_callback){__defer_callback = defer_callback;}
private:
F __defer_callback;
};
//简化构造 //为了方便
template<class F>
Defer<F> make_defer(const F& end_fun){return Defer<F>(end_fun);}
//宏 //模仿go的书写格式
#define defer(F) auto __rul_defer = make_defer(F);
int main(){
defer([](){
std::cout<<"hello"<<std::endl;
})
return 0;
}
其他实现
https://gitee.com/keybox/actor-library/blob/master/actor/commons/commons_utils.h