fork download
  1. #include <memory>
  2. #include <iostream>
  3.  
  4. template<typename T, typename TPtr>
  5. struct Deep
  6. {
  7. TPtr ptr;
  8.  
  9. Deep() : ptr(new T) {}
  10.  
  11. T get() const { return *ptr; }
  12. void set(T t) { *ptr = t; }
  13.  
  14. Deep(const Deep& other): ptr(new T(*other.ptr)) {}
  15. };
  16.  
  17. template<typename T, typename TPtr>
  18. struct Shallow
  19. {
  20. TPtr ptr;
  21.  
  22. Shallow() : ptr(new T) {}
  23.  
  24. T get() const { return *ptr; }
  25. void set(T t) { *ptr = t; }
  26.  
  27. Shallow(const Shallow& other) = default;
  28. };
  29.  
  30. template<typename T>
  31. using raw_ptr = T*;
  32.  
  33. template<typename T>
  34. void test(const T& a1)
  35. {
  36. auto a2 = a1;
  37. a2.set(a2.get() + 1);
  38. std::cout << a1.get() << " " << a2.get() << std::endl;
  39. }
  40.  
  41. using std::shared_ptr;
  42.  
  43. int main()
  44. {
  45. Deep<int, raw_ptr<int> > rawDeep;
  46. rawDeep.set(1);
  47. test(rawDeep);
  48.  
  49. Deep<int, shared_ptr<int> > sharedDeep;
  50. sharedDeep.set(1);
  51. test(sharedDeep);
  52.  
  53. Shallow<int, raw_ptr<int> > rawShallow;
  54. rawShallow.set(1);
  55. test(rawShallow);
  56.  
  57. Shallow<int, shared_ptr<int> > sharedShallow;
  58. sharedShallow.set(1);
  59. test(sharedShallow);
  60. }
Success #stdin #stdout 0s 3232KB
stdin
Standard input is empty
stdout
1 2
1 2
2 2
2 2