#include <iostream>
#include <functional>
using namespace std;
template <typename T>
class Property{
private:
T val;
std::function<void(T& v,const T& newV)> setFN = nullptr;
public:
void setter(decltype(setFN) newSetter){
setFN = newSetter;
}
void set(const T& newVal){
if(!setFN)
val = newVal;
else
setFN(val,newVal);
}
T get(){
return val;
}
};
int main() {
Property<int> x;
x.set(5);
std::cout << x.get() << std::endl;
x.setter([](int& v, const int& newV){std::cout << "Setter called\n"; v=newV;});
x.set(2);
std::cout << x.get() << std::endl;
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBQcm9wZXJ0eXsKCXByaXZhdGU6CgkKCVQgdmFsOwoJCglzdGQ6OmZ1bmN0aW9uPHZvaWQoVCYgdixjb25zdCBUJiBuZXdWKT4gc2V0Rk4gPSBudWxscHRyOwoJCglwdWJsaWM6CgkKCXZvaWQgc2V0dGVyKGRlY2x0eXBlKHNldEZOKSBuZXdTZXR0ZXIpewoJCXNldEZOID0gbmV3U2V0dGVyOwoJfQoJCQoJdm9pZCBzZXQoY29uc3QgVCYgbmV3VmFsKXsKCQlpZighc2V0Rk4pCgkJCXZhbCA9IG5ld1ZhbDsKCQllbHNlCgkJCXNldEZOKHZhbCxuZXdWYWwpOwoJfQoJCglUIGdldCgpewoJCXJldHVybiB2YWw7Cgl9Cn07CgppbnQgbWFpbigpIHsKCQoJUHJvcGVydHk8aW50PiB4OwoJCgl4LnNldCg1KTsKCXN0ZDo6Y291dCA8PCB4LmdldCgpIDw8IHN0ZDo6ZW5kbDsKCQoJeC5zZXR0ZXIoW10oaW50JiB2LCBjb25zdCBpbnQmIG5ld1Ype3N0ZDo6Y291dCA8PCAiU2V0dGVyIGNhbGxlZFxuIjsgdj1uZXdWO30pOwoJCgl4LnNldCgyKTsKCXN0ZDo6Y291dCA8PCB4LmdldCgpIDw8IHN0ZDo6ZW5kbDsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCXJldHVybiAwOwp9