首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在离开作用域时滥用c++11 unique_ptr来执行代码

在离开作用域时滥用c++11 unique_ptr来执行代码
EN

Stack Overflow用户
提问于 2015-02-25 21:04:41
回答 3查看 899关注 0票数 2

我想使用std::unique_ptr的删除器来保证一些代码在离开作用域后会执行,例如,假设我有一个带有函数set_event()的类Event

我想确保在离开作用域后,函数my_event.set_event()将被调用。我设法找到了类似这样的东西:

代码语言:javascript
运行
复制
Event my_event;
auto releasing_function = [&my_event] (void*){my_event.set_event();};
std::unique_ptr<void, decltype(releasing_function)> safe_event((void*)1, releasing_function);

但我觉得我们可以做得更好。也许是一个没有这个自动lambda功能的班轮,或者是避免了这个丑陋的(void*)1。甚至可以完全删除unique_ptr

编辑:我想避免使用工具类。那太容易了:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-25 21:19:11

为了便于使用,在某些标头中定义一个maker函数:

代码语言:javascript
运行
复制
template<class F> auto scope_guard(F&& f) {
    return std::unique_ptr<void, std::decay<F>::type>{(void*)1, std::forward<F>(f)};
}

并把它当作:

代码语言:javascript
运行
复制
auto unique = scope_guard([&](void*){/* cleanup here */});
票数 8
EN

Stack Overflow用户

发布于 2015-02-25 21:10:37

最初的C++03 ScopeGuard : Petru Marginean (和小Andrei Alexandrescu)使用了各种各样的技巧。使用C++11,您可以只使用一个std::function和lambda表达式来表示您想要做的事情。例如。

代码语言:javascript
运行
复制
class Scope_guard
{
private:
    function<void()> cleanup_;
public:
    void release() { cleanup_ = []{}; }
    ~Scope_guard() { cleanup_(); }
    Scope_guard( function<void()> f )
        : cleanup_( move( f ) )
    {}
};

免责声明:编译器未触及的代码。

注意:显然纯粹主义者更喜欢用带有工厂函数的类模板来表达,而单纯主义者(simpletons?)像我一样喜欢上面这样的东西。但你知道这个主意。

票数 0
EN

Stack Overflow用户

发布于 2015-02-25 21:13:27

你为什么不“用手”去做呢?

代码语言:javascript
运行
复制
{
    struct Guard {
        Event my_event;
        explicit Guard (Event my_event) : my_event (my_event) { }
        ~Guard () { my_event.set_event (); }
    };
    Guard guard {my_event};

    /* ... */

   // when scope is left, guard's destructor will be called
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28729545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档