defer
和here说明了Golang样式here的一般概念。
[我想知道,STL(C ++ 11,C ++ 14,...)还是Boost或某些其他库包含此类的实现?因此,我可以使用它,而不必在每个新项目中都重新实现它。
[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; });
此实现是零开销的,与其他一些答案不同,并且在语法上更易于使用。它还具有零依赖性,从而减少了编译时间。
[我在CppCon 2014(_
)上介绍了Go样式defer
的仅标头实现;我称它为YouTube link。恕我直言,就教导性,效率和绝对防呆而言,这仍然是最好的选择。在使用中,它看起来像这样:
-O2
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();
}
}
};
像这样使用:
#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_;
};
,libgolang,commit 1)。用法就像:
defer