什么是C ++中的标准延迟/ finalizer实现?

问题描述 投票:7回答:8

deferhere说明了Golang样式here的一般概念。

[我想知道,STL(C ++ 11,C ++ 14,...)还是Boost或某些其他库包含此类的实现?因此,我可以使用它,而不必在每个新项目中都重新实现它。

c++ boost go stl raii
8个回答
7
投票

[proposal for std::unique_resource_t将启用类似代码的代码>>

std::unique_resource_t

对于资源,它定义了通用的auto file=make_unique_resource(::fopen(filename.c_str(),"w"),&::fclose); ,应与scope_exit相同:

defer

// Always say goodbye before returning, auto goodbye = make_scope_exit([&out]() ->void { out << "Goodbye world..." << std::endl; });


11
投票

此实现是零开销的,与其他一些答案不同,并且在语法上更易于使用。它还具有零依赖性,从而减少了编译时间。


6
投票

[我在CppCon 2014(_)上介绍了Go样式defer的仅标头实现;我称它为YouTube link。恕我直言,就教导性,效率和绝对防呆而言,这仍然是最好的选择。在使用中,它看起来像这样:


2
投票
这是我的解决方案,类似于您迅速遇到的类型,但是我不处理任何异常(如果需要,可以轻松添加,只需使用PSIAlt解决方案中的try / catch块即可:]]

-O2


0
投票
在出现新标准之前,我为此使用简单的RAII类:

class Defer { using F = std::function<void(void)>; std::vector<F> funcs; void add(F f) { funcs.push_back(f); } public: Defer(F f) { add(f); } Defer() {} Defer(const Defer& ) = delete; Defer& operator= (const Defer& ) = delete; void operator() (F f) { add(f); } ~Defer() { for(;!funcs.empty();) { funcs.back()(); funcs.pop_back(); } } };


0
投票
这是我的延迟实现,但没有其他保证,我仍然认为这不是很好的实现。

像这样使用:


0
投票
#include <iostream> #include "defer.hpp" using namespace std; int main() { defer []{cout << "defered" << endl;}; } 提供

defer实现(#define DEFER_CONCAT_IMPL(x, y) x##y #define DEFER_CONCAT(x, y) DEFER_CONCAT_IMPL(x, y) #define AUTO_DEFER_VAR DEFER_CONCAT(__defer, __LINE__) #define defer ::__defer AUTO_DEFER_VAR; AUTO_DEFER_VAR- class __defer { public: template<typename Callable> void operator- (Callable&& callable) { defer_ = std::forward<Callable>(callable); } ~__defer() { defer_(); } private: std::function<void(void)> defer_; }; libgolangcommit 1)。用法就像:


-1
投票
像这样使用:

defer

© www.soinside.com 2019 - 2024. All rights reserved.