#include <iostream>
#include <cmath>
using namespace std;
template<typename T, typename V>
class Property {
private:
T* ref;
V (*fn)(T);
public:
Property(T* val, V (*fn)(T)) {
this->ref = val;
this->fn = fn;
}
V operator()() {
return fn(*ref);
}
template<typename T2, typename V2>
friend ostream& operator<<(ostream& o, Property<T2, V2> p) {
o << p();
return o;
}
};
template<typename T, typename V>
void print_stuff(Property<T, V> p) {
cout << p << endl;
}
int main() {
int* a = new int();
*a = 25;
Property<int, double> b(a, sqrt);
print_stuff(b);
*a = 36;
print_stuff(b);
delete a;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBWPgpjbGFzcyBQcm9wZXJ0eSB7CnByaXZhdGU6CglUKiByZWY7CglWICgqZm4pKFQpOwoJCnB1YmxpYzoKCVByb3BlcnR5KFQqIHZhbCwgViAoKmZuKShUKSkgewoJCXRoaXMtPnJlZiA9IHZhbDsKCQl0aGlzLT5mbiA9IGZuOwoJfQoJCglWIG9wZXJhdG9yKCkoKSB7CgkJcmV0dXJuIGZuKCpyZWYpOwoJfQoJCgl0ZW1wbGF0ZTx0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVjI+CglmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvLCBQcm9wZXJ0eTxUMiwgVjI+IHApIHsKCQlvIDw8IHAoKTsKCQlyZXR1cm4gbzsKCX0KCQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVj4Kdm9pZCBwcmludF9zdHVmZihQcm9wZXJ0eTxULCBWPiBwKSB7Cgljb3V0IDw8IHAgPDwgZW5kbDsKfQoKaW50IG1haW4oKSB7CglpbnQqIGEgPSBuZXcgaW50KCk7CgkqYSA9IDI1OwoJUHJvcGVydHk8aW50LCBkb3VibGU+IGIoYSwgc3FydCk7CglwcmludF9zdHVmZihiKTsKCSphID0gMzY7CglwcmludF9zdHVmZihiKTsKCWRlbGV0ZSBhOwoJcmV0dXJuIDA7Cn0=