c++实现go关键字defer
go的defer关键字 ,更像是RAII思想的延续,只不过执行的是用户代码
其中风格3 说明了为什么采用acquire_defer 方式来处理
风格1:
class Defer
{
public:
~Defer()
{
_cb();
}
std::function<void(void)> _cb;
};
#define defer(x) std::shared_ptr<Defer>acquire_defer = std::make_shared<Defer>();acquire_defer->_cb=x;
auto x = new int;
void func()
{
//useage
defer([=]()
{
delete x;
//do something....
cout << "111" << endl;
});
cout << "2222" << endl;
//do something...
}
int main(int argc, char* argv[])
{
func();
system("pause");
return 0;
}
风格2:
class Defer
{
public:
~Defer()
{
_cb();
}
std::function<void(void)> _cb;
};
#define defer(x) std::shared_ptr<Defer>acquire_defer = std::make_shared<Defer>();acquire_defer->_cb=[=](){x();};
auto x = new int;
void final1()
{
cout << "111111" << endl;
}
void func()
{
//useage
defer(final1);
cout << "2222" << endl;
//do something...
}
int main(int argc, char* argv[])
{
func();
system("pause");
return 0;
}
风格3:
class Defer
{
public:
~Defer()
{
_cb();
}
std::function<void(void)> _cb;
};
#define defer(x) std::shared_ptr<Defer>acquire_defer = std::make_shared<Defer>();acquire_defer->_cb=x;
auto x = new int;
std::function<void(void)>* _cb;
void func()
{
//useage
defer([=]()
{
delete x;
//do something....
cout << "111" << endl;
});
cout << "2222" << endl;
//do something...
_cb = new std::function<void(void)>([=]()
{
acquire_defer;
cout << "3333333" << endl;
});
}
int main(int argc, char* argv[])
{
func();
// (*_cb)();
cout << "44444" << endl;
delete _cb;
system("pause");
return 0;
}