Skip to content

Instantly share code, notes, and snippets.

@JuanDiegoMontoya
Created August 6, 2021 23:34
Show Gist options
  • Save JuanDiegoMontoya/a7bc3f3022b194ad5045b95b0c0b9487 to your computer and use it in GitHub Desktop.
Save JuanDiegoMontoya/a7bc3f3022b194ad5045b95b0c0b9487 to your computer and use it in GitHub Desktop.
#pragma once
#include <concepts>
#include <utility>
template<std::invocable Fn>
class Defer
{
public:
constexpr Defer(Fn&& f) noexcept : f_(std::move(f)) {}
constexpr Defer(const Fn& f) : f_(f) {}
constexpr ~Defer() { if (!dismissed_) f_(); }
constexpr void Cancel() noexcept { dismissed_ = true; }
Defer(const Defer&) = delete;
Defer(Defer&&) = delete;
Defer& operator=(const Defer&) = delete;
Defer& operator=(Defer&&) = delete;
private:
bool dismissed_{ false };
Fn f_;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment