您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

71 行
1.4KB

  1. #pragma once
  2. #include <utility>
  3. namespace sr
  4. {
  5. template<class Deleter>
  6. class scope_guard_t
  7. {
  8. public:
  9. explicit scope_guard_t(Deleter&& deleter) noexcept : m_deleter(std::move(deleter)),
  10. m_execute_on_destruction(true)
  11. {
  12. }
  13. scope_guard_t(scope_guard_t&& other) noexcept : m_deleter(std::move(other.m_deleter)),
  14. m_execute_on_destruction(other.m_execute_on_destruction)
  15. {
  16. other.release();
  17. }
  18. scope_guard_t(const scope_guard_t&) = delete;
  19. ~scope_guard_t()
  20. {
  21. if( m_execute_on_destruction == true )
  22. {
  23. callDeleterSafe();
  24. }
  25. }
  26. void release()
  27. {
  28. m_execute_on_destruction = false;
  29. }
  30. scope_guard_t& operator=(const scope_guard_t&) = delete;
  31. scope_guard_t& operator=(scope_guard_t&&) = delete;
  32. private:
  33. void callDeleterSafe() noexcept
  34. {
  35. try
  36. {
  37. m_deleter();
  38. }
  39. catch( ... ) { /* Empty */ }
  40. }
  41. Deleter m_deleter;
  42. bool m_execute_on_destruction;
  43. };
  44. template<class Deleter>
  45. scope_guard_t<Deleter> scope_guard(Deleter&& deleter) noexcept
  46. {
  47. return scope_guard_t<Deleter>(std::move(deleter));
  48. }
  49. }