#include <iostream>
#include <functional>
using namespace std;
#define RO_PROP(T, N, G) ro_prop<T> N = ro_prop<T>([this]() { return G; })
template <typename T> class ro_prop
{
private:
const function<T()> get;
public:
ro_prop(const function<T()> &&get) : get(get) {}
operator T() { return get(); }
};
struct rect
{
int width, height;
RO_PROP(int, area, width * height);
};
int main()
{
rect a { 2, 3 };
int s = a.area;
cout << s << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIFJPX1BST1AoVCwgTiwgRykgcm9fcHJvcDxUPiBOID0gcm9fcHJvcDxUPihbdGhpc10oKSB7IHJldHVybiBHOyB9KQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIHJvX3Byb3AKewogIHByaXZhdGU6CiAgICBjb25zdCBmdW5jdGlvbjxUKCk+IGdldDsKCiAgcHVibGljOgogICAgcm9fcHJvcChjb25zdCBmdW5jdGlvbjxUKCk+ICYmZ2V0KSA6IGdldChnZXQpIHt9CiAgICBvcGVyYXRvciBUKCkgeyByZXR1cm4gZ2V0KCk7IH0KfTsKCnN0cnVjdCByZWN0CnsKICBpbnQgd2lkdGgsIGhlaWdodDsKICBST19QUk9QKGludCwgYXJlYSwgd2lkdGggKiBoZWlnaHQpOwp9OwoKaW50IG1haW4oKQp7CiAgcmVjdCBhIHsgMiwgMyB9OwogIGludCBzID0gYS5hcmVhOwogIAogIGNvdXQgPDwgcyA8PCBlbmRsOwogIAogIHJldHVybiAwOwp9