#include <iostream>
#include <vector>
class VisualizableVector {
public:
class proxy {
public:
proxy (std::vector<int> *v) : vect (v) {
std::cout << "Before size is: " << vect->size() << std::endl;
}
std::vector<int> * operator -> () { return vect; }
std::vector<int> & operator * () { return *vect; }
operator std::vector<int>&() { return *vect; }
~proxy () { std::cout << "After size is: " << vect->size() << std::endl; }
private:
std::vector <int> * vect;
};
VisualizableVector (std::vector<int> *v) : vect(v) {}
~VisualizableVector () { delete vect; }
proxy operator -> () { return proxy (vect); }
proxy operator * () { return proxy (vect); }
private:
std::vector <int> * vect;
};
int main()
{
VisualizableVector vecc (new std::vector<int>);
vecc->push_back (10); // 1. Note use of -> operator instead of . operator
vecc->push_back (20); // 2. ok
(*vecc)->push_back (30); // 3. ok
//(*vecc).push_back (40); // 4. error
static_cast<std::vector<int>>(*vecc).push_back (40); // 4.a ok
std::vector<int>& vec_ref = *vecc; // implicit static_cast<std::vector<int>>
vec_ref.push_back (40); // 4.b ok
(**vecc).push_back (50); // 5. ok
// vecc->->push_back (60); // 6. error
}