Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- template<class objectDT, class propertyDT>
- class property {
- private:
- propertyDT (objectDT::*_getterMethod)();
- void (objectDT::*_setterMethod)(propertyDT);
- objectDT *_propertyInstance;
- propertyDT get();
- void set(propertyDT);
- public:
- void ReadOnly(objectDT*, propertyDT (objectDT::*)());
- void ReadWrite(objectDT*, void (objectDT::*)(propertyDT),
- propertyDT (objectDT::*)());
- void WriteOnly(objectDT* ob, void (objectDT::*setter)(propertyDT));
- void operator = (propertyDT);
- operator propertyDT() { return get(); }
- friend ostream& operator << (ostream& stream, property &p) {
- return stream << (propertyDT)p.get();
- }
- friend istream& operator >> (istream& stream, property &p) {
- propertyDT temp;
- stream >> temp;
- p.set(temp);
- return stream;
- }
- };
- template <class objectDT, class propertyDT>
- void property<objectDT, propertyDT>::ReadOnly(objectDT* ob, propertyDT (objectDT::*getter)())
- {
- _propertyInstance = ob;
- _getterMethod = getter;
- _setterMethod = NULL;
- }
- template <class objectDT, class propertyDT>
- void property<objectDT, propertyDT>::ReadWrite(objectDT* ob,
- void (objectDT::*setter)(propertyDT), propertyDT (objectDT::*getter)())
- {
- _propertyInstance = ob;
- _getterMethod = getter;
- _setterMethod = setter;
- }
- template <class objectDT, class propertyDT>
- void property<objectDT, propertyDT>::WriteOnly(objectDT* ob,
- void (objectDT::*setter)(propertyDT)) {
- _propertyInstance = ob;
- _getterMethod = NULL;
- _setterMethod = setter;
- }
- template <class objectDT, class propertyDT>
- propertyDT property<objectDT, propertyDT> :: get() {
- if(_propertyInstance == NULL) {
- throw new std::string("Property instance is not set.");
- }
- if(_getterMethod == NULL) {
- throw new std:: string("Getter not set.");
- }
- return (_propertyInstance->*_getterMethod)();
- }
- template <class objectDT, class propertyDT>
- void property<objectDT, propertyDT>::set(propertyDT value) {
- (_propertyInstance->*_setterMethod)(value);
- }
- template <class objectDT, class propertyDT>
- void property<objectDT, propertyDT> :: operator=(propertyDT value) {
- if(_propertyInstance == NULL) {
- throw new std::string("Property instance is not set.");
- }
- if(_setterMethod == NULL) {
- throw new std::string("Cannot set READ ONLY property.");
- }
- set(value);
- }
- int main() {
- }
Advertisement
Add Comment
Please, Sign In to add comment