gpt4 book ai didi

c++ - 离开作用域时调用函数

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:20 25 4
gpt4 key购买 nike

离开范围时自动调用函数的最优雅的解决方案是什么?我目前的做法(见下文)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 用作要调用的函数对象的情况下必须这样做)。

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

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

关于c++ - 离开作用域时调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22656542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com