fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. struct releaseable_object
  5. {
  6. releaseable_object() : dummy_ptr(new int) {}
  7. void Release()
  8. {
  9. std::cout << "Releasing releaseable object\n";
  10. delete dummy_ptr;
  11. }
  12. int *const dummy_ptr;
  13. };
  14.  
  15. struct A : releaseable_object {};
  16. struct B : releaseable_object {};
  17.  
  18. namespace factory
  19. {
  20. A *CreateA(/* lots of parameters */) { return new A; }
  21. B *CreateB(/* lots of parameters */) { return new B; }
  22. }
  23.  
  24. template <typename T> struct Managed
  25. {
  26. using type = T;
  27. struct deleter {
  28. void operator()(T* object) {
  29. std::cout << "Release!\n";
  30. object->Release();
  31. }
  32. };
  33. using pointer = std::unique_ptr<T, deleter>;
  34. };
  35.  
  36. struct ManagedA : Managed<A>
  37. {
  38. using base = Managed<A>;
  39. using base::pointer;
  40. ManagedA(/* lots of parameters */)
  41. {
  42. // do A specific stuff...
  43. A *a = factory::CreateA(/* lots of parameters */);
  44. // more A specific stuff...
  45.  
  46. // wrap the pointer:
  47. m_pointer.reset(a);
  48. }
  49. pointer m_pointer;
  50. };
  51.  
  52. int main()
  53. {
  54. std::cout << sizeof(void*) << '\n';
  55. std::cout << sizeof(ManagedA::pointer) << '\n';
  56. return 0;
  57. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
4
4