3 ms·
GSL finally is a lot more ergonomic: #include <utility> // std::move, std::forward // final_action allows you to ensure something gets run at the end
by usefulcat 7y ago
GSL finally is a lot more ergonomic:
#include <utility> // std::move, std::forward
// final_action allows you to ensure something gets run at the end of a scope
template <class F>
class final_action {
public:
explicit final_action(F f) noexcept : f_(std::move(f)) {}
final_action(final_action&& other) noexcept :
f_(std::move(other.f_)), invoke_(other.invoke_)
{
other.invoke_ = false;
}
final_action(const final_action&) = delete;
final_action& operator=(const final_action&) = delete;
~final_action() noexcept { if (invoke_) f_(); }
private:
F f_;
bool invoke_ {true};
};
// finally() - convenience function to generate a final_action
template <class F>
inline final_action<F> finally(const F& f) noexcept {
return final_action<F>(f);
}
template <class F>
inline final_action<F> finally(F&& f) noexcept {
return final_action<F>(std::forward<F>(f));
}
Usage:
auto deferred = finally([&]{ /* deferred stuff */ });
https://github.com/microsoft/GSL/blob/master/include/gsl/gsl_util https://github.com/microsoft/GSL/blob/master/include/gsl/gsl...