Recently I'd touched an article about properties in python. They were implemented using special function property and looked very elegant:
class A(object): def __init__(self): self._x = None def get_x(self): return self._x def set_x(self, x): self._x = x x = property(get_x, set_x) obj = A() obj.x = 6 # set print obj.x # getWe don't have such option in c++. But it's quite simple to create one. Some implementation I saw were ugly indeed. They used a lot of code and wanted to call some routines in constructor. My version of property in c++:
#include <iostream> template<typename T, T(*s)(T &, const T &), T(*g)(T &)> class property { public: T operator =(const T &nt) { return s(t, nt); } operator T() { return g(t); } protected: T t; }; class A { public: static int setter(int &i, const int &ni) { cout << "S" << endl; i = ni; return i; } static int getter(int &i) { cout << "G" << endl; return i; } property<int, setter, getter> p; }; int main(int argc, char **argv) { A a; a.p = 6; std::cout << a.p; return 0; }You have to define 2 static class methods(or just functions, doesn't matter) for setter and getter of the property. The modified version of class property may have default setter and getter:
template<typename T> T setter(T &i, const T &ni) { i = ni; return i; } template<typename T> T getter(T &i) { return i; } template<typename T, T(*s)(T &, const T &) = setter<T>, T(*g)(T &) = getter<T> > class property { public: T operator =(const T &nt) { return s(t, nt); } operator T() { return g(t); } protected: T t; };Now you can customize only one of them:
int getter(int &i) { cout << "G" << endl; return i; } class A { public: A(int a) { p = a; } property<int, setter<int>, getter> p; };
No comments:
Post a Comment