Cleaner.h 625 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #ifndef CLEANER_H
  2. #define CLEANER_H
  3. template<typename T, void (*F)(T&)>
  4. class Cleaner final {
  5. T wrapped;
  6. public:
  7. Cleaner() {
  8. }
  9. Cleaner(const T& t) : wrapped(t) {
  10. }
  11. ~Cleaner() {
  12. F(wrapped);
  13. }
  14. Cleaner(const Cleaner&) = delete;
  15. Cleaner(Cleaner&&) = delete;
  16. Cleaner& operator=(const Cleaner&) = delete;
  17. Cleaner& operator=(Cleaner&&) = delete;
  18. T* operator->() {
  19. return &wrapped;
  20. }
  21. T* operator&() {
  22. return &wrapped;
  23. }
  24. operator const T() const {
  25. return wrapped;
  26. }
  27. operator T() {
  28. return wrapped;
  29. }
  30. };
  31. #endif