当函数返回或超出例程范围时运行例程?

时间:2015-07-30 14:35:04

标签: c++ exception-handling

在C ++中,有一种很好的方法可以在函数返回或作用域例程到外时自动运行某些例程吗?

使用goto语句似乎有所帮助,但是当抛出异常而没有被catch或finally语句处理时它会丢失。不幸的是,finally语句不能在C ++中使用。 RAII是另一种方法,但它强迫我每次都定义一个类,这比最终声明更麻烦。

2 个答案:

答案 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";
}