
#include <vector>
#include <iostream>
#include <exception>

using namespace std;

template <typename T>
class SVector : public vector<T>
{

public:
	class Element_Proxy
	{
	public:
		Element_Proxy (T* element) : element (element) {};

		operator T() {
			if (element) {
				return *element;
			} else {
				return T();
			}

		}

		Element_Proxy& operator= (const T& e) {
			if (element) {
				*element = e;

			}
			return *this;
		}

	private:
		T* element;
	};

	struct property {
		//SVector *vec;


		property& operator= (size_t size) {
			vector<T> *black = (vector<T>*) ( (char*) this - sizeof (vector<T>));
			black->resize (size);
			return *this;
		}

		operator size_t() {
			vector<T> *black = (vector<T>*) ( (char*) this - sizeof (vector<T>));

			return black->size();
		}
	};

	property len;

	SVector (const vector<T> &vec) : vector<T> (vec) {}

	Element_Proxy operator[] (size_t n) {
		if (size() <= n) {
			return Element_Proxy (nullptr);
		} else {
			return Element_Proxy (data() + n);
		}
	}
};

int main()
{
	vector<int> uv;
	uv.push_back (5);

	SVector<int> v = uv;
	v.len = 100;

	v[10] = 42;
	cout << v[10] << endl;

	return 0;
}
