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 及其自定义删除器,但由于我并没有真正在这里获取资源,因此就代码可读性而言,这对我来说听起来也不太好。有什么建议?
以这种方式使用构造函数/析构函数是解决此类排序问题的常见方法。我将它用于锁(构造函数获取锁,析构函数释放它)和日志记录目的(构造函数在构造时打印一些内容,析构函数在销毁时打印一些内容,给出了一个很好的项目调用图 - 在后一种情况下,使用宏也可以获取__FILE__并__LINE__存储在对象中,这样我们就可以看到构造函数被调用的位置[对于析构函数来说几乎不可能做到这一点,但通常可以看到构造函数并确定析构函数被调用的位置])。