#include <iostream>
template<class T ,class C,const T&(C::*Get0)()>
class Getter{
public:
Getter(C* c):Th(c){}
//Getter() = delete;
Getter(const Getter&) = delete;
operator const T&() {
return (Th->*Get0)();
}
const T& Get() {
return (Th->*Get0)();
}
protected:
C *Th = nullptr;
};
template<class T ,class C,void (C::*Set0)(const T&)>
class Setter{
public:
Setter(C* c):Th(c){}
//Setter() = delete;
Setter(const Setter&) = delete;
Setter& operator =(const Setter& In) {
(Th->*Set0)(In);
return In;
}
const T& operator =(const T& In) {
(Th->*Set0)(In);
return In;
}
void Set(const T& In) {
(Th->*Set0)(In);
}
protected:
C *Th = nullptr;
};
/**/
template<class T, class C,const T& (C::*Get)(), void (C::*Set)(const T&), class TG = Getter<T,C,Get>, class TS = Setter<T,C,Set> >
class Property : public TG, TS {
public:
Property(C* Th) : TG(Th), TS(Th) {}
Property(const Property&) = delete;
Property() = delete;
/* Property& operator =(const Property& In) {
(This->*Set(In));
return In;
}
*/
};
/**/
template<class T>
class Test {
public:
typedef T Type;
Test():P(this),G(this),S(this){}
bool Show() {
std::cout << N__ << std::endl;
return true;
}
protected:
const T& TheGetter() {
return N__;
}
void TheSetter(const T& N_) {
N__ = N_;
}
protected:
T N__ = 0;
public:
Property<T,Test<T>,&Test<T>::TheGetter,&Test<T>::TheSetter> P;
Getter< T, Test<T>, &Test<T>::TheGetter> G;
Setter < T, Test, &Test::TheSetter> S;
};
int main() {
Test<int> T;
T.Show();
T.S = 100;
//int X = T.P;
int Y = T.G;
std::cout << Y << std::endl;
//T.P = 1000;
T.Show();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8Y2xhc3MgVCAsY2xhc3MgQyxjb25zdCBUJihDOjoqR2V0MCkoKT4KY2xhc3MgR2V0dGVyewpwdWJsaWM6CgoJR2V0dGVyKEMqIGMpOlRoKGMpe30KCS8vR2V0dGVyKCkgPSBkZWxldGU7CglHZXR0ZXIoY29uc3QgR2V0dGVyJikgPSBkZWxldGU7CQoJCglvcGVyYXRvciBjb25zdCBUJigpIHsKCQlyZXR1cm4gKFRoLT4qR2V0MCkoKTsKCX0KCgljb25zdCBUJiBHZXQoKSB7CgkJcmV0dXJuIChUaC0+KkdldDApKCk7Cgl9Cgpwcm90ZWN0ZWQ6CglDICpUaCA9IG51bGxwdHI7Cn07CnRlbXBsYXRlPGNsYXNzIFQgLGNsYXNzIEMsdm9pZCAoQzo6KlNldDApKGNvbnN0IFQmKT4KY2xhc3MgU2V0dGVyewpwdWJsaWM6CgoJU2V0dGVyKEMqIGMpOlRoKGMpe30KCS8vU2V0dGVyKCkgPSBkZWxldGU7CglTZXR0ZXIoY29uc3QgU2V0dGVyJikgPSBkZWxldGU7CQoJCglTZXR0ZXImIG9wZXJhdG9yID0oY29uc3QgU2V0dGVyJiBJbikgewoJCShUaC0+KlNldDApKEluKTsKCQlyZXR1cm4gSW47Cgl9Cgljb25zdCBUJiBvcGVyYXRvciA9KGNvbnN0IFQmIEluKSB7CgkJKFRoLT4qU2V0MCkoSW4pOwoJCXJldHVybiBJbjsKCX0KCXZvaWQgU2V0KGNvbnN0IFQmIEluKSB7CgkJKFRoLT4qU2V0MCkoSW4pOwoJfQpwcm90ZWN0ZWQ6CglDICpUaCA9IG51bGxwdHI7Cn07CgovKiovCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIEMsY29uc3QgVCYgKEM6OipHZXQpKCksIHZvaWQgKEM6OipTZXQpKGNvbnN0IFQmKSwgY2xhc3MgVEcgPSBHZXR0ZXI8VCxDLEdldD4sIGNsYXNzIFRTID0gU2V0dGVyPFQsQyxTZXQ+ID4KY2xhc3MgUHJvcGVydHkgOiBwdWJsaWMgVEcsIFRTIHsKcHVibGljOgoJUHJvcGVydHkoQyogVGgpIDogVEcoVGgpLCBUUyhUaCkge30KCVByb3BlcnR5KGNvbnN0IFByb3BlcnR5JikgPSBkZWxldGU7CglQcm9wZXJ0eSgpID0gZGVsZXRlOwovKglQcm9wZXJ0eSYgb3BlcmF0b3IgPShjb25zdCBQcm9wZXJ0eSYgSW4pIHsKCQkoVGhpcy0+KlNldChJbikpOwoJCXJldHVybiBJbjsKCX0KCSovCn07Ci8qKi8KdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgVGVzdCB7CnB1YmxpYzoKCgl0eXBlZGVmIFQgVHlwZTsKCglUZXN0KCk6UCh0aGlzKSxHKHRoaXMpLFModGhpcyl7fQoJCglib29sIFNob3coKSB7CgkJc3RkOjpjb3V0IDw8IE5fXyA8PCBzdGQ6OmVuZGw7CgkJcmV0dXJuIHRydWU7Cgl9Cgpwcm90ZWN0ZWQ6Cgljb25zdCBUJiBUaGVHZXR0ZXIoKSB7CgkJcmV0dXJuIE5fXzsKCX0KCgl2b2lkIFRoZVNldHRlcihjb25zdCBUJiBOXykgewoJCU5fXyA9IE5fOwoJfQoKcHJvdGVjdGVkOgoJVCBOX18gPSAwOwpwdWJsaWM6CglQcm9wZXJ0eTxULFRlc3Q8VD4sJlRlc3Q8VD46OlRoZUdldHRlciwmVGVzdDxUPjo6VGhlU2V0dGVyPiBQOwoJR2V0dGVyPCBULCBUZXN0PFQ+LCAmVGVzdDxUPjo6VGhlR2V0dGVyPiBHOwoJU2V0dGVyIDwgVCwgVGVzdCwgJlRlc3Q6OlRoZVNldHRlcj4gUzsKfTsKCmludCBtYWluKCkgewoJVGVzdDxpbnQ+IFQ7CglULlNob3coKTsKCVQuUyA9IDEwMDsKCS8vaW50IFggPSBULlA7CglpbnQgWSA9IFQuRzsKCgoJc3RkOjpjb3V0IDw8IFkgPDwgc3RkOjplbmRsOwoKCS8vVC5QID0gMTAwMDsKCglULlNob3coKTsKCglyZXR1cm4gMDsKfQo=