#include <iostream>
#include <functional>
#include <string>
class StringProxyDemo {
public:
class Proxy {
public:
Proxy(std::string value) : _value(std::move(value)) { }
std::string *operator->() { return &_value; }
private:
std::string _value;
};
Proxy operator->() {
return _function();
}
StringProxyDemo(std::function<std::string()> function)
: _function(std::move(function)) { }
private:
std::function<std::string()> _function;
};
int main() {
StringProxyDemo demo(
[]() -> std::string {
return "Hello, World!";
}
);
std::cout << demo->size() << std::endl;
std::cout << demo->c_str() << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHN0cmluZz4KCmNsYXNzIFN0cmluZ1Byb3h5RGVtbyB7CnB1YmxpYzoKCWNsYXNzIFByb3h5IHsKCXB1YmxpYzoKCQlQcm94eShzdGQ6OnN0cmluZyB2YWx1ZSkgOiBfdmFsdWUoc3RkOjptb3ZlKHZhbHVlKSkgeyB9CgkJc3RkOjpzdHJpbmcgKm9wZXJhdG9yLT4oKSB7IHJldHVybiAmX3ZhbHVlOyB9Cglwcml2YXRlOgoJCXN0ZDo6c3RyaW5nIF92YWx1ZTsKCX07CgkKCVByb3h5IG9wZXJhdG9yLT4oKSB7CgkJcmV0dXJuIF9mdW5jdGlvbigpOwoJfQoJCglTdHJpbmdQcm94eURlbW8oc3RkOjpmdW5jdGlvbjxzdGQ6OnN0cmluZygpPiBmdW5jdGlvbikKCTogX2Z1bmN0aW9uKHN0ZDo6bW92ZShmdW5jdGlvbikpIHsgfQoJCnByaXZhdGU6CglzdGQ6OmZ1bmN0aW9uPHN0ZDo6c3RyaW5nKCk+IF9mdW5jdGlvbjsKfTsKCmludCBtYWluKCkgewoJU3RyaW5nUHJveHlEZW1vIGRlbW8oCgkJW10oKSAtPiBzdGQ6OnN0cmluZyB7CgkJCXJldHVybiAiSGVsbG8sIFdvcmxkISI7CgkJfQoJKTsKCXN0ZDo6Y291dCA8PCBkZW1vLT5zaXplKCkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGRlbW8tPmNfc3RyKCkgPDwgc3RkOjplbmRsOwp9Cg==