- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的印象是它是第三方编写的库中包含的 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/
我的代码需要范围守卫,但是我是否必须手动 Dismiss() 从函数正常退出时所有范围守卫?即 void Deleter(MyClass* obj) { delete obj; } MyCla
我在一个函数中分配了多个资源,因此有很多指针,我必须从中返回一个指针(比如 ret_ptr)并在离开函数之前释放其他指针(所有 othr_ptr)。 我在这个函数中有多个导出点(其中 ret_ptr
我遇到了this article多年前由 Andrei Alexandrescu 和 Petru Marginean 编写,其中介绍并讨论了一个名为 ScopeGuard 的实用程序类,用于编写异常安
我正在尝试写一个简单的 ScopeGuard based on Alexandrescu concepts但使用 c++11 习语。 namespace RAII { template
我的印象是它是第三方编写的库中包含的 C++ 类。我试着在谷歌上搜索,我发现了一篇帖子说使用它是个好主意。但是,它未能准确描述它是什么以及我如何将它合并到我的代码中。谢谢。 最佳答案 ScopeGua
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: prohibiting instantiation as a temporary object (C++)
ON_BLOCK_EXIT 是 ScopeGuard 提供的实用程序宏implementation .它定义一个本地对象的唯一原因是当它超出范围时执行其用户提供的析构函数。它被定义为: #define
考虑这些代码在现实生活中发生。 库代码具有一个名为log_on()的函数,失败时返回false,成功时返回true,但是错误案例过多。 在返回true/false之前,它需要调用指定的回调函数应用程序
我是一名优秀的程序员,十分优秀!