Guest User

Untitled

a guest
Oct 16th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.38 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Resource {
  5. public:
  6. Resource() {
  7. cout << "Resource created\n";
  8. }
  9.  
  10. ~Resource() {
  11. cout << "Resource deleted\n";
  12. }
  13. };
  14.  
  15. void makeResourceByArgument(Resource ** rs) {
  16. *rs = new Resource();
  17. }
  18.  
  19. void resourceDeleter(Resource * rs) {
  20. delete rs;
  21. }
  22.  
  23. template<typename resource_t>
  24. class CallbackOnOutOfScope {
  25. using callback_t = void (*)(resource_t*);
  26.  
  27. resource_t * m_resource;
  28. callback_t m_callback;
  29. public:
  30. explicit CallbackOnOutOfScope(callback_t callback)
  31. : m_resource{ nullptr }, m_callback{ callback }
  32. {}
  33.  
  34. ~CallbackOnOutOfScope() noexcept {
  35. m_callback(m_resource);
  36. }
  37.  
  38. void operator=(resource_t * resource) { m_resource = resource; }
  39. resource_t operator*() { return *m_resource; }
  40.  
  41. CallbackOnOutOfScope(const CallbackOnOutOfScope &) = delete;
  42. CallbackOnOutOfScope(const CallbackOnOutOfScope &&) = delete;
  43.  
  44. CallbackOnOutOfScope & operator=(const CallbackOnOutOfScope &) = delete;
  45. CallbackOnOutOfScope & operator=(const CallbackOnOutOfScope &&) = delete;
  46. };
  47.  
  48. int main() {
  49. cout << "Before scope\n";
  50. {
  51. cout << "Scope start\n";
  52. CallbackOnOutOfScope<Resource> resource(resourceDeleter);
  53. makeResourceByArgument(reinterpret_cast<Resource**>(&resource));
  54. cout << "Scope end\n";
  55. }
  56. cout << "After scope\n";
  57.  
  58. return 0;
  59. }
Add Comment
Please, Sign In to add comment