离开作用域时自动调用函数的最优雅的解决方案是什么?
我目前的方法(见下文)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(使用前将#替换为@)