lnicola
6/24/2014 - 1:03 PM

C++ properties

C++ properties

template<typename T, typename P, void (P::*set_handler)(T data), T (P::*get_handler)()> class property
{
private:
	P &parent;

public:
	property(P &parent) : parent(parent) { }

	void operator=(T data)
	{
		(parent.*set_handler)(data);
	}

	operator T()
	{
		return (parent.*get_handler)();
	}
};

template<typename T, typename P, T (P::*get_handler)()> class property_get
{
private:
	T &data;
	P &parent;

public:
	property_get(P &parent, T &data) : parent(parent), data(data) { }

	void operator=(T data)
	{
		this->data = data;
	}

	operator T()
	{
		return (parent.*get_handler)();
	}
};

template<typename T, typename P, T (P::*get_handler)()> class property_only_get
{
private:
	P &parent;

public:
	property_only_get(P &parent) : parent(parent) { }

	operator T()
	{
		return (parent.*get_handler)();
	}
};

template<typename T, typename P, void (P::*set_handler)(T data)> class property_set
{
private:
	T &data;
	P &parent;

public:
	property_set(P &parent, T &data) : parent(parent), data(data) { }

	void operator=(T data)
	{
		(parent.*set_handler)(data);
	}

	operator T()
	{
		return data;
	}
};

class my_class
{
private:
	unsigned int m_int;

	void on_set(unsigned int data)
	{
		m_int = data - 1;
	}

	unsigned int on_get()
	{
		return m_int * m_int;
	}

public:
	property<unsigned int, my_class,  &my_class::on_set, &my_class::on_get> my_int;

	my_class() : my_int(*this) { }
};

unsigned int __cdecl main()
{
	//my_class mc;

	//unsigned int tmp;
	//mc.my_int = tmp;
	//return mc.my_int;
	int acc;
	return acc > 0;
}