
#include <iostream>
#include <vector>

using namespace std;

template <typename T>
class mvector : public vector<T> {
public:
	class SizeProxy {
	public:

		mvector* parent()
		{
			return (mvector<T>*)((char*)(this) - offsetof(mvector<T>, Count));
		}

		operator size_t() {
			return parent()->size();
		}

		SizeProxy& operator =(size_t val)
		{
			parent()->resize(val);
			return *this;
		}
	};

	class ElemProxy {
		T* p;

	public:
		ElemProxy(T* p = nullptr) : p (p)
		{}

		operator T() {
			if (p)
			{
				return *p;
			}
			else
			{
				return T();
			}
		}

		ElemProxy& operator =(const T& val)
		{
			if (p)
				*p = val;

			return *this;
		}

		ElemProxy& operator =(T&& val)
		{
			if (p) *p = move(val);

			return *this;
		}



	};

	ElemProxy operator [] (size_t i) {
		return i < this->size() ? ElemProxy(this->data() + i) : ElemProxy();
	}

	SizeProxy Count;
};

int main()
{
	mvector<int> v;

	v.push_back(5);
	v.push_back(6);

	v[100] = 1000;
	cout << v[500] << endl;

	mvector<int> copy = v;

	copy.Count = 10;

	for (auto i : copy) cout << i << endl;

	return 0;
}

