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;
}