离开作用域时调用函数

Tob*_*ann 5 c++ scope raii c++11

离开作用域时自动调用函数的最优雅的解决方案是什么?我目前的方法(见下文)有效,但我想应该有一些更通用的东西,比如为此编写自定义类。

#include <iostream>
#include <functional>

using namespace std;

class DoInDtor
{
public:
    typedef function<void()> F;
    DoInDtor(F f) : f_(f) {};
    ~DoInDtor() { f_(); }
private:
    F f_;
};

void foo()
{
    DoInDtor byeSayerCustom([](){ cout << "bye\n"; });

    auto cond = true; // could of course also be false
    if ( cond )
        return;

    return;
}

int main()
{
    foo();
}
Run Code Online (Sandbox Code Playgroud)

当然,人们可能会滥用 std::unique_ptr 及其自定义删除器,但由于我并没有真正在这里获取资源,因此就代码可读性而言,这对我来说听起来也不太好。有什么建议?

Mat*_*son 2

以这种方式使用构造函数/析构函数是解决此类排序问题的常见方法。我将它用于锁(构造函数获取锁,析构函数释放它)和日志记录目的(构造函数在构造时打印一些内容,析构函数在销毁时打印一些内容,给出了一个很好的项目调用图 - 在后一种情况下,使用宏也可以获取__FILE____LINE__存储在对象中,这样我们就可以看到构造函数被调用的位置[对于析构函数来说几乎不可能做到这一点,但通常可以看到构造函数并确定析构函数被调用的位置])。