离开作用域时调用函数

2023-11-25

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

#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();
}

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


Angew 和 Cassio 正在通过 ScopeGuard 为您指明正确的方向。使用 std::function 可能会导致动态内存分配,并且不是最有效的解决方案。基于 ScopeGuard 的实现通过将要调用的函数对象的类型作为模板参数编码到 ScopeGuard 类本身中来避免这种情况。使用辅助函数模板,您永远不必显式声明该类型,编译器会为您推导它(并且在将 lambda 用作要调用的函数对象的情况下必须这样做)。

我没有在这里重复所有细节,而是最近写了两篇关于这个领域的文章:

  • 让你的编译器做你的家务
  • OnLeavingScope:续集

第一篇文章侧重于简单性,并从与您原来的问题类似的地方开始,包括一个激励性的示例。第二个经历了所有步骤,将其发展为高效且健壮的实现,从而产生简洁、非常可读的代码。第二篇文章还解释了所提供的材料如何与 Andrei 的 ScopeGuard 工作以及 Cassio 提到的scope_exit C++ 标准提案相关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

离开作用域时调用函数 的相关文章

随机推荐