#include <iostream>
//running only vc.
//cant compile gcc on ideon.
template<class T ,class C,const T&(C::*Get0)()>
class Getter{
public:
Getter(C* c):ThG(c){}
//Getter() = delete;
Getter(const Getter&) = delete;
operator const T&() {
return (ThG->*Get0)();
}
const T& Get() const {
return (ThG->*Get0)();
}
protected:
C *ThG = nullptr;
};
template<class T ,class C,void (C::*Set0)(const T&)>
class Setter{
public:
Setter(C* c):ThS(c){}
//Setter() = delete;
Setter(const Setter&) = delete;
Setter& operator =(const Setter& In) {
(ThS->*Set0)(In);
return In;
}
const T& operator =(const T& In) {
(ThS->*Set0)(In);
return In;
}
void Set(const T& In) const {
(ThS->*Set0)(In);
}
protected:
C *ThS = nullptr;
};
template<class T, class C,const T& (C::*Get)(), void (C::*Set)(const T&) >
class Property : public Getter<T,C,Get>,Setter<T,C,Set> {
public:
Property(C* Th) :Getter<T,C,Get>(Th), Setter<T,C,Set>(Th) {}//gcc
//Property(C* Th) :Getter(Th), Setter(Th) {}//vc
Property(const Property&) = delete;
Property() = delete;
const Property& operator =(const Property& In) {
this->Set(In.Get());
return In;
}
const T& operator =(const T& In) {
this->Set(In);
return In;
}
};
template<class T>
class Test {
public:
typedef T Type;
Test():G(this),S(this),P(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.P = T.P;
T.Show();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy9ydW5uaW5nIG9ubHkgdmMuCi8vY2FudCBjb21waWxlIGdjYyBvbiBpZGVvbi4KCnRlbXBsYXRlPGNsYXNzIFQgLGNsYXNzIEMsY29uc3QgVCYoQzo6KkdldDApKCk+CmNsYXNzIEdldHRlcnsKcHVibGljOgoKCUdldHRlcihDKiBjKTpUaEcoYyl7fQoJLy9HZXR0ZXIoKSA9IGRlbGV0ZTsKCUdldHRlcihjb25zdCBHZXR0ZXImKSA9IGRlbGV0ZTsJCgkKCW9wZXJhdG9yIGNvbnN0IFQmKCkgewoJCXJldHVybiAoVGhHLT4qR2V0MCkoKTsKCX0KCgljb25zdCBUJiBHZXQoKSBjb25zdCB7CgkJcmV0dXJuIChUaEctPipHZXQwKSgpOwoJfQoKcHJvdGVjdGVkOgoJQyAqVGhHID0gbnVsbHB0cjsKfTsKdGVtcGxhdGU8Y2xhc3MgVCAsY2xhc3MgQyx2b2lkIChDOjoqU2V0MCkoY29uc3QgVCYpPgpjbGFzcyBTZXR0ZXJ7CnB1YmxpYzoKCglTZXR0ZXIoQyogYyk6VGhTKGMpe30KCS8vU2V0dGVyKCkgPSBkZWxldGU7CglTZXR0ZXIoY29uc3QgU2V0dGVyJikgPSBkZWxldGU7CQoJCglTZXR0ZXImIG9wZXJhdG9yID0oY29uc3QgU2V0dGVyJiBJbikgewoJCShUaFMtPipTZXQwKShJbik7CgkJcmV0dXJuIEluOwoJfQoJY29uc3QgVCYgb3BlcmF0b3IgPShjb25zdCBUJiBJbikgewoJCShUaFMtPipTZXQwKShJbik7CgkJcmV0dXJuIEluOwoJfQoJdm9pZCBTZXQoY29uc3QgVCYgSW4pIGNvbnN0IHsKCQkoVGhTLT4qU2V0MCkoSW4pOwoJfQoJCnByb3RlY3RlZDoKCUMgKlRoUyA9IG51bGxwdHI7Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBDLGNvbnN0IFQmIChDOjoqR2V0KSgpLCB2b2lkIChDOjoqU2V0KShjb25zdCBUJikgPgpjbGFzcyBQcm9wZXJ0eSA6IHB1YmxpYyBHZXR0ZXI8VCxDLEdldD4sU2V0dGVyPFQsQyxTZXQ+IHsKcHVibGljOgoJUHJvcGVydHkoQyogVGgpIDpHZXR0ZXI8VCxDLEdldD4oVGgpLCBTZXR0ZXI8VCxDLFNldD4oVGgpIHt9Ly9nY2MKCS8vUHJvcGVydHkoQyogVGgpIDpHZXR0ZXIoVGgpLCBTZXR0ZXIoVGgpIHt9Ly92YwoJUHJvcGVydHkoY29uc3QgUHJvcGVydHkmKSA9IGRlbGV0ZTsKCVByb3BlcnR5KCkgPSBkZWxldGU7Cgljb25zdCBQcm9wZXJ0eSYgb3BlcmF0b3IgPShjb25zdCBQcm9wZXJ0eSYgSW4pIHsKCQl0aGlzLT5TZXQoSW4uR2V0KCkpOwoJCXJldHVybiBJbjsKCX0JCgljb25zdCBUJiBvcGVyYXRvciA9KGNvbnN0IFQmIEluKSB7CgkJdGhpcy0+U2V0KEluKTsKCQlyZXR1cm4gSW47Cgl9Cn07CnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIFRlc3QgewpwdWJsaWM6CgoJdHlwZWRlZiBUIFR5cGU7CgoJVGVzdCgpOkcodGhpcyksUyh0aGlzKSxQKHRoaXMpe30KCQoJYm9vbCBTaG93KCkgewoJCXN0ZDo6Y291dCA8PCBOX18gPDwgc3RkOjplbmRsOwoJCXJldHVybiB0cnVlOwoJfQoKcHJvdGVjdGVkOgoJY29uc3QgVCYgVGhlR2V0dGVyKCkgewoJCXJldHVybiBOX187Cgl9CgoJdm9pZCBUaGVTZXR0ZXIoY29uc3QgVCYgTl8pIHsKCQlOX18gPSBOXzsKCX0KCnByb3RlY3RlZDoKCVQgTl9fID0gMDsKcHVibGljOgoJUHJvcGVydHk8VCxUZXN0PFQ+LCZUZXN0PFQ+OjpUaGVHZXR0ZXIsJlRlc3Q8VD46OlRoZVNldHRlcj4gUDsKCUdldHRlcjwgVCwgVGVzdDxUPiwgJlRlc3Q8VD46OlRoZUdldHRlcj4gRzsKCVNldHRlciA8IFQsIFRlc3QsICZUZXN0OjpUaGVTZXR0ZXI+IFM7Cn07CgppbnQgbWFpbigpIHsKCVRlc3Q8aW50PiBUOwoJVC5TaG93KCk7CglULlMgPSAxMDA7CglpbnQgWCA9IFQuUDsKCWludCBZID0gVC5HOwoKCglzdGQ6OmNvdXQgPDwgWSA8PCBzdGQ6OmVuZGw7CgoJVC5QID0gMTAwMDsKCVQuUCA9IFQuUDsKCglULlNob3coKTsKCglyZXR1cm4gMDsKfQ==