在C ++中,有一种很好的方法可以在函数返回或作用域例程到外时自动运行某些例程吗?
使用goto语句似乎有所帮助,但是当抛出异常而没有被catch或finally语句处理时它会丢失。不幸的是,finally语句不能在C ++中使用。 RAII是另一种方法,但它强迫我每次都定义一个类,这比最终声明更麻烦。
答案 0 :(得分:0)
如果您使用的是c ++ / 11,则可以始终创建一个可在其析构函数中运行任何函数的通用可重用类。
#include <iostream>
#include <functional>
class RAIIPattern final
{
public:
typedef std::function<void()> Func_t;
RAIIPattern(Func_t onExitScope) : m_onExitScope(onExitScope) { }
~RAIIPattern() {
if (m_onExitScope) m_onExitScope();
}
private:
// No copy
RAIIPattern(const RAIIPattern&);
RAIIPattern& operator=(const RAIIPattern&);
Func_t m_onExitScope;
};
int main ()
{
using namespace std;
RAIIPattern onExit([] { cout << "on exit 1" << endl; });
{
RAIIPattern onExit([] { cout << "on exit 2" << endl; });
}
return 0;
}
答案 1 :(得分:0)
RAII是另一种方式,但它迫使我定义一个类 每一次,这比最后陈述更麻烦。
您可以使用Boost.ScopeExit。
或者使用std::function
或lambdas编写自己的通用解决方案。这是基本的想法:
#include <iostream>
template <class Function>
class ScopeExit final
{
private:
Function function;
public:
ScopeExit(Function function) : function(function) {}
~ScopeExit() { function(); }
ScopeExit(ScopeExit const&) = delete;
ScopeExit &operator=(ScopeExit const&) = delete;
};
template <class Function>
ScopeExit<Function> MakeScopeExit(Function function)
{
return ScopeExit<Function>(function);
}
int main()
{
auto scope_exit = MakeScopeExit([]() { std::cout << "exit\n"; });
std::cout << "function body\n";
}