#include <vector>
#include <iostream>

using namespace std;

template<typename T>
class svector : public vector<T>
{
public:
	svector() {}
	svector (const vector<T>& v) : vector<T> (v) {}


	class SizeProxy
	{

	private:
		svector <T>* Parent() {
			return (svector<T>*) ( (char*) this - offsetof (svector<T>, len));
		}

	public:
		SizeProxy& operator= (size_t i) {
			Parent()->resize (i);
			return *this;
		}

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


	};

	SizeProxy len;

	class ElementProxy
	{
		T* elem;
	public:
		ElementProxy (T* element) : elem (element) {}

		ElementProxy& operator= (const T& a) {
			if (elem) {
				*elem = a;
			}
			return *this;
		}
		operator T() {
			if (elem) {
				return *elem;
			} else return T();
		}

	};

	ElementProxy operator[] (size_t index) {
		if (index >= size()) {
			return ElementProxy (nullptr);
		}

		return ElementProxy (data() + index);
	}
};


int main()
{
	vector<int> v;
	v.push_back (1);
	v.push_back (2);
	v.push_back (3);
	svector<int> s = v;

	s.len = 10;
	s[10] = 123;
	//cout << s[1] << ' ' << s.len << endl;
	//cout << s[10] << ' ' << s.len << endl;
	for (auto& i : s)
		cout << i << '\n';

	return 0;
}
