fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. class VisualizableVector {
  5. public:
  6. class proxy {
  7. public:
  8. proxy (std::vector<int> *v) : vect (v) {
  9. std::cout << "Before size is: " << vect->size() << std::endl;
  10. }
  11. std::vector<int> * operator -> () { return vect; }
  12. std::vector<int> & operator * () { return *vect; }
  13. operator std::vector<int>&() { return *vect; }
  14. ~proxy () { std::cout << "After size is: " << vect->size() << std::endl; }
  15. private:
  16. std::vector <int> * vect;
  17. };
  18. VisualizableVector (std::vector<int> *v) : vect(v) {}
  19. ~VisualizableVector () { delete vect; }
  20. proxy operator -> () { return proxy (vect); }
  21. proxy operator * () { return proxy (vect); }
  22. private:
  23. std::vector <int> * vect;
  24. };
  25.  
  26. int main()
  27. {
  28. VisualizableVector vecc (new std::vector<int>);
  29.  
  30. vecc->push_back (10); // 1. Note use of -> operator instead of . operator
  31. vecc->push_back (20); // 2. ok
  32. (*vecc)->push_back (30); // 3. ok
  33. //(*vecc).push_back (40); // 4. error
  34. static_cast<std::vector<int>>(*vecc).push_back (40); // 4.a ok
  35.  
  36. std::vector<int>& vec_ref = *vecc; // implicit static_cast<std::vector<int>>
  37. vec_ref.push_back (40); // 4.b ok
  38.  
  39. (**vecc).push_back (50); // 5. ok
  40. // vecc->->push_back (60); // 6. error
  41. }
Success #stdin #stdout 0s 3464KB
stdin
Standard input is empty
stdout
Before size is: 0
After size is: 1
Before size is: 1
After size is: 2
Before size is: 2
After size is: 3
Before size is: 3
After size is: 3
Before size is: 3
After size is: 3
Before size is: 4
After size is: 5