#include #include using namespace std; template class Attr { private: typedef const theType &(theClass::*GetterMethod)(void) const; typedef void (theClass::*SetterMethod)(const theType &); GetterMethod getter; SetterMethod setter; public: Attr(GetterMethod _getter, SetterMethod _setter) : getter(_getter), setter(_setter) {} const theType &getValue(const theClass *tc) const { return (tc->*getter)(); } void setValue(theClass *tc, const theType &_value) const { (tc->*setter)(_value); } }; class FirstBase { private: string str; public: const string &getStr(void) const { return str; } void setStr(const string &_str) { str = _str; } }; class MultiBase { public: virtual const int &getX(void) const =0; virtual void setX(const int &_x) =0; }; class Multi : public FirstBase, virtual public MultiBase { private: int x; public: static Attr x_attr; const int &getX(void) const { return x; } void setX(const int &_x) { x = _x; } }; class Single : public MultiBase { private: int x; public: static Attr x_attr; const int &getX(void) const { return x; } void setX(const int &_x) { x = _x; } }; Attr Multi::x_attr(&Multi::getX, &Multi::setX); Attr Single::x_attr(&Single::getX, &Single::setX); const int Xvalue(5); int main(void) { Single single; single.setX(Xvalue); cout << Single::x_attr.getValue(&single) << endl; Single::x_attr.setValue(&single, 10); cout << Single::x_attr.getValue(&single) << endl; Multi multi; multi.setX(Xvalue); cout << Multi::x_attr.getValue(&multi) << endl; Multi::x_attr.setValue(&multi, 10); cout << Multi::x_attr.getValue(&multi) << endl; }