gpt4 book ai didi

c++ - C++ 中的 ScopeGuard 是什么?

转载 作者:可可西里 更新时间:2023-11-01 17:05:08 30 4
gpt4 key购买 nike

我的印象是它是第三方编写的库中包含的 C++ 类。我试着在谷歌上搜索,我发现了一篇帖子说使用它是个好主意。但是,它未能准确描述它是什么以及我如何将它合并到我的代码中。谢谢。

最佳答案

ScopeGuard 曾经是范围保护的特定实现 by Petru Marginean and Andrei Alexandrescu .这个想法是让保护对象的析构函数在作用域的末尾调用用户指定的清理操作(读取: block ),除非作用域保护被解散。 Marginean 提出了一个巧妙的想法,即根据对 const 的引用的生命周期扩展,为 C++03 声明一个范围保护对象。

今天“作用域守卫”更普遍。

范围守卫基于 RAII(用于清理的自动析构函数调用),就像例如for 循环基于跳转,但通常不会将 for 循环称为基于跳转的代码段,因为它会丢失大部分信息是关于,同样,通常不会将作用域守卫称为 RAII。 for 循环比跳转具有更高的抽象级别,并且是一个更专业的概念。范围守卫比 RAII 具有更高的抽象级别,并且是一个更专业的概念。


在 C++11 中,范围守卫可以根据 std::function 简单地实现,并通过 lambda 表达式在每个地方提供清理操作。

例子:

#include <functional>       // std::function
#include <utility> // std::move

namespace my {
using std::function;
using std::move;

class Non_copyable
{
private:
auto operator=( Non_copyable const& ) -> Non_copyable& = delete;
Non_copyable( Non_copyable const& ) = delete;
public:
auto operator=( Non_copyable&& ) -> Non_copyable& = default;
Non_copyable() = default;
Non_copyable( Non_copyable&& ) = default;
};

class Scope_guard
: public Non_copyable
{
private:
function<void()> cleanup_;

public:
friend
void dismiss( Scope_guard& g ) { g.cleanup_ = []{}; }

~Scope_guard() { cleanup_(); }

template< class Func >
Scope_guard( Func const& cleanup )
: cleanup_( cleanup )
{}

Scope_guard( Scope_guard&& other )
: cleanup_( move( other.cleanup_ ) )
{ dismiss( other ); }
};

} // namespace my

#include <iostream>
void foo() {}
auto main() -> int
{
using namespace std;
my::Scope_guard const final_action = []{ wclog << "Finished! (Exit from main.)\n"; };

wcout << "The answer is probably " << 6*7 << ".\n";
}

function 的作用是避免模板化,以便 Scope_guard 实例可以这样声明并传递。另一种方法稍微复杂一些,使用上也有一些限制,但效率可能稍微高一点,就是在仿函数类型上模板化一个类,并使用 C++11 auto 进行声明,并使用范围保护由工厂函数创建的实例。这两种技术都是简单的 C++11 方法来完成 Marginean 为 C++03 的引用生命周期扩展所做的事情。

关于c++ - C++ 中的 ScopeGuard 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31365013/

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