fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4.  
  5. template<typename T>
  6. class CountedInstance
  7. {
  8. public:
  9. CountedInstance() { sCount++; }
  10.  
  11. ~CountedInstance() { --sCount; }
  12.  
  13. unsigned count() const { return sCount; }
  14.  
  15. private:
  16. static unsigned sCount;
  17. };
  18.  
  19. template<typename T>
  20. unsigned CountedInstance<T>::sCount = 0;
  21.  
  22.  
  23. template<class T>
  24. class SharedResource : public CountedInstance<T>
  25. {
  26. public:
  27. typedef std::shared_ptr<T> Ptr;
  28.  
  29. SharedResource() : mPtr((this->count() == 1) ? Ptr(new T) : Ptr()) {}
  30.  
  31. private:
  32. Ptr mPtr;
  33. };
  34.  
  35.  
  36. struct Timer {
  37. Timer() { std::cout << "Create Timer" << std::endl; }
  38. ~Timer() { std::cout << "Destroy Timer" << std::endl; }
  39. };
  40.  
  41. struct Widget : public SharedResource<Timer>
  42. {
  43. Widget() { std::cout << " Create Widget " << this->count() << std::endl; }
  44. ~Widget() { std::cout << " Destroy Widget " << this->count() << std::endl; }
  45. };
  46.  
  47. int main()
  48. {
  49. { Widget w1, w2, w3; }
  50. { Widget w1, w2, w3; }
  51. { Widget w1, w2, w3; }
  52. }
Success #stdin #stdout 0s 2968KB
stdin
Standard input is empty
stdout
Create Timer
  Create Widget 1
  Create Widget 2
  Create Widget 3
  Destroy Widget 3
  Destroy Widget 2
  Destroy Widget 1
Destroy Timer
Create Timer
  Create Widget 1
  Create Widget 2
  Create Widget 3
  Destroy Widget 3
  Destroy Widget 2
  Destroy Widget 1
Destroy Timer
Create Timer
  Create Widget 1
  Create Widget 2
  Create Widget 3
  Destroy Widget 3
  Destroy Widget 2
  Destroy Widget 1
Destroy Timer