MaximCherchuk

The most painful

Apr 8th, 2015
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.48 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. template<class objectDT, class propertyDT>
  6. class property {
  7. private:
  8.     propertyDT (objectDT::*_getterMethod)();
  9.     void (objectDT::*_setterMethod)(propertyDT);
  10.     objectDT *_propertyInstance;
  11.     propertyDT get();
  12.     void set(propertyDT);
  13. public:
  14.     void ReadOnly(objectDT*, propertyDT (objectDT::*)());
  15.     void ReadWrite(objectDT*, void (objectDT::*)(propertyDT),
  16.                    propertyDT (objectDT::*)());
  17.     void WriteOnly(objectDT* ob, void (objectDT::*setter)(propertyDT));
  18.     void operator = (propertyDT);
  19.     operator propertyDT() { return get(); }
  20.    
  21.     friend ostream& operator << (ostream& stream, property &p) {
  22.         return stream << (propertyDT)p.get();
  23.     }
  24.     friend istream& operator >> (istream& stream, property &p) {
  25.         propertyDT temp;
  26.         stream >> temp;
  27.         p.set(temp);
  28.         return stream;
  29.     }
  30. };
  31.  
  32. template <class objectDT, class propertyDT>
  33. void property<objectDT, propertyDT>::ReadOnly(objectDT* ob, propertyDT (objectDT::*getter)())
  34. {
  35.   _propertyInstance = ob;
  36.   _getterMethod = getter;
  37.   _setterMethod = NULL;
  38. }
  39.  
  40. template <class objectDT, class propertyDT>
  41. void property<objectDT, propertyDT>::ReadWrite(objectDT* ob,
  42.         void (objectDT::*setter)(propertyDT), propertyDT (objectDT::*getter)())
  43. {
  44.   _propertyInstance = ob;
  45.   _getterMethod = getter;
  46.   _setterMethod = setter;
  47. }
  48.  
  49. template <class objectDT, class propertyDT>
  50. void property<objectDT, propertyDT>::WriteOnly(objectDT* ob,
  51.                                         void (objectDT::*setter)(propertyDT)) {
  52.     _propertyInstance = ob;
  53.     _getterMethod = NULL;
  54.     _setterMethod = setter;
  55. }
  56.  
  57. template <class objectDT, class propertyDT>
  58. propertyDT property<objectDT, propertyDT> :: get() {
  59.     if(_propertyInstance == NULL) {
  60.         throw new std::string("Property instance is not set.");
  61.     }
  62.     if(_getterMethod == NULL) {
  63.         throw new std:: string("Getter not set.");
  64.     }
  65.     return (_propertyInstance->*_getterMethod)();
  66. }
  67.  
  68. template <class objectDT, class propertyDT>
  69. void property<objectDT, propertyDT>::set(propertyDT value) {
  70.     (_propertyInstance->*_setterMethod)(value);
  71. }
  72.  
  73. template <class objectDT, class propertyDT>
  74. void property<objectDT, propertyDT> :: operator=(propertyDT value) {
  75.     if(_propertyInstance == NULL) {
  76.         throw new std::string("Property instance is not set.");
  77.     }
  78.     if(_setterMethod == NULL) {
  79.         throw new std::string("Cannot set READ ONLY property.");
  80.     }
  81.     set(value);
  82. }
  83.  
  84. int main() {
  85.    
  86. }
Advertisement
Add Comment
Please, Sign In to add comment