fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <memory>
  4. using namespace std;
  5.  
  6. template<typename T>
  7. struct ObjectPointers {
  8. const std::shared_ptr<ObjectPointers<T>> left;
  9. const std::shared_ptr<ObjectPointers<T>> right;
  10. std::vector<T> data;
  11.  
  12. // initialize left and right in constructor
  13. ObjectPointers(std::initializer_list<T> list) : data(list) {
  14. }
  15.  
  16. ObjectPointers(const ObjectPointers &c) = default;
  17. ~ObjectPointers(){ // no need, shared ptr take care
  18. }
  19.  
  20. ObjectPointers(std::shared_ptr<ObjectPointers<T>> left, std::shared_ptr<ObjectPointers<T>> right) : left(left), right(right) {}
  21.  
  22. void show()const {
  23. std::cout<<"data\n";
  24. for (auto &x:data)
  25. std::cout<<"\t"<<x<<std::endl;
  26. std::cout<<"end of data\n";
  27. if (left) {
  28. std::cout<<"Recurstive left:\n";
  29. left->show();
  30. std::cout<<"end of recursive left\n";
  31. }
  32. else cout<<"no left\n";
  33. if (right){
  34. std::cout<<"Recurstive right:\n";
  35. right->show();
  36. std::cout<<"end of recursive right\n";
  37. }
  38. else cout<<"no right\n";
  39. }
  40. };
  41.  
  42. //overload +
  43. template <class T>
  44. ObjectPointers<T> operator+ (ObjectPointers<T> a, ObjectPointers<T> b) {
  45. // I create a new object with the left and right of the current object
  46. return ObjectPointers<T>(std::make_shared<ObjectPointers<T>>(a), std::make_shared<ObjectPointers<T>>(b));
  47. }
  48.  
  49.  
  50. int main() {
  51. ObjectPointers<int> a = {1, 2, 3};
  52. ObjectPointers<int> b = {4, 5, 6};
  53. ObjectPointers<int> c = a + b;
  54. c.show();
  55.  
  56. return 0;
  57. }
Success #stdin #stdout 0.01s 5548KB
stdin
Standard input is empty
stdout
data
end of data
Recurstive left:
data
	1
	2
	3
end of data
no left
no right
end of recursive left
Recurstive right:
data
	4
	5
	6
end of data
no left
no right
end of recursive right