fork download
  1. #include <iostream>
  2. #include <utility>
  3.  
  4. template<typename Deleter>
  5. class ScopeGuard
  6. {
  7. private:
  8. bool active_;
  9. Deleter deleter_;
  10.  
  11. public:
  12. ScopeGuard() = delete;
  13. ScopeGuard(ScopeGuard const &) = delete;
  14. ScopeGuard(ScopeGuard &&) = delete;
  15. ScopeGuard & operator =(ScopeGuard const &) = delete;
  16. ScopeGuard & operator =(ScopeGuard &&) = delete;
  17.  
  18. ScopeGuard(Deleter deleter)
  19. :
  20. active_{true},
  21. deleter_(std::move(deleter))
  22. {}
  23.  
  24. ~ScopeGuard() noexcept
  25. {
  26. if (active_) deleter_();
  27. }
  28.  
  29. void dismiss()
  30. {
  31. active_ = false;
  32. }
  33. };
  34.  
  35. template<typename Deleter>
  36. ScopeGuard<Deleter> make_scope_guard(Deleter deleter)
  37. {
  38. return {std::move(deleter)};
  39. }
  40.  
  41. int main()
  42. {
  43. auto && guard1 = make_scope_guard([] { std::cout << "guard1\n"; });
  44. auto && guard2 = make_scope_guard([] { std::cout << "guard2\n"; });
  45.  
  46. guard1.dismiss();
  47. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
guard2