C++11 使用std::unique_ptr和lambdas提升对象的状态

C++11 使用std::unique_ptr和lambdas提升对象的状态,c++11,unique-ptr,scopeguard,C++11,Unique Ptr,Scopeguard,在推进对象的状态时,使用std::swap可以很好地处理简单对象和指针交换。对于其他就地操作,它工作得相当好,但是如果您想在函数之间共享退出处理程序,它就不是非常优雅了。是否有一种C++11本机方法可以实现类似于Boost.ScopeExit的功能,但允许更好的代码重用?(Ab)使用std::unique_ptr的自定义删除程序作为ScopeExitVisitor或Post条件。向下滚动至main()的第7行,查看呼叫站点实际如何使用此功能。以下示例允许不需要任何参数的std::function

在推进对象的状态时,使用
std::swap
可以很好地处理简单对象和指针交换。对于其他就地操作,它工作得相当好,但是如果您想在函数之间共享退出处理程序,它就不是非常优雅了。是否有一种C++11本机方法可以实现类似于Boost.ScopeExit的功能,但允许更好的代码重用?

(Ab)使用
std::unique_ptr
的自定义删除程序作为
ScopeExitVisitor
或Post条件。向下滚动至
main()
的第7行,查看呼叫站点实际如何使用此功能。以下示例允许不需要任何参数的
std::function
Deleter
/
ScopeExitVisitor
的lambdas,如果确实需要将参数传递给
Deleter
/
ScopeExitVisitor
,则允许嵌套类

#包括
#包括
甲级{
公众:
使用类型=A;
使用Ptr=类型*;
使用ScopeExitVisitorFunc=std::function;
使用ScopeExitVisitor=std::unique\u ptr;
//可以更改A的私有成员的删除程序。注意:即使
//用作std::unique_ptr删除程序,这些删除程序不会删除
//因为他们仅仅是访客和唯一称之为删除者的人
//实际上并不拥有该对象(因此标签为ScopeExitVisitor)。
静态无效范围ExitVisitorVar1(Ptr aPtr){
标准::cout