#pragma once // system includes #include #include namespace espcpputils { template class CleanupHelper { public: CleanupHelper(T && cleanup) : m_cleanup{std::move(cleanup)} {} ~CleanupHelper() { if (m_cleanup) (*m_cleanup)(); } void disarm() { m_cleanup = std::nullopt; } private: std::optional m_cleanup; }; template CleanupHelper makeCleanupHelper(T && cleanup) { return CleanupHelper(std::move(cleanup)); } } // namespace espcpputils