我想写的是
void foo()
{
int a = 5;
ExecuteOnUnwind eou(bind(&cleanupFunc, a));
}
当函数返回或抛出cleanupFunc(a)
异常时调用它。是否有一些可用的设施可以为我做这件事?我无法在谷歌上找到正确的短语,但似乎可能有一些东西可以做到这一点。如果没有,我很快在下面整理了一个解决方案。奇怪的是,它似乎不能在发布模式下工作,但在 vc10 上的调试中工作 - 我如何调整实现以使其在两者上一致地工作而不冒额外调用临时文件的风险?
编辑:修复涉及使用 shared_ptr; 也减轻了对临时破坏的任何担忧。新代码如下
template <typename T>
struct ExecuteOnUnwindHelper
{
ExecuteOnUnwindHelper(const T & _functor) : mFunctor(_functor)
{
}
~ExecuteOnUnwindHelper()
{
mFunctor();
}
const T & mFunctor;
};
template <typename T>
boost::shared_ptr<ExecuteOnUnwindHelper<T>> ExecuteOnUnwind(const T & _functor)
{
return boost::shared_ptr<ExecuteOnUnwindHelper<T>>(new ExecuteOnUnwindHelper<T>(_functor));
}
void cleanupFunc(int a)
{
wcout << L"cleanup" << endl;
}
void foo()
{
int a = 5;
auto eou = ExecuteOnUnwind(boost::bind(&cleanupFunc, 5));
}
int main()
{
foo();
return 0;
}