#include <iostream>
#include <string>
struct foo
{
std::string name;
};
struct foowrapper1
{
foo const& obj;
};
foowrapper1 print1(foo const& obj)
{
return {obj};
}
struct foowrapper2
{
foo const& obj;
};
foowrapper2 print2(foo const& obj)
{
return {obj};
}
std::ostream& operator<<(std::ostream& lhs, foowrapper1 const& rhs)
{
lhs << '(' << rhs.obj.name << ')';
}
std::ostream& operator<<(std::ostream& lhs, foowrapper2 const& rhs)
{
lhs << '[' << rhs.obj.name << ']';
}
int main()
{
foo f;
f.name = "blah";
std::cout << print1(f) << print2(f);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKc3RydWN0IGZvbwp7CglzdGQ6OnN0cmluZyBuYW1lOwp9OwoKc3RydWN0IGZvb3dyYXBwZXIxCnsKCWZvbyBjb25zdCYgb2JqOwp9OwoKZm9vd3JhcHBlcjEgcHJpbnQxKGZvbyBjb25zdCYgb2JqKQp7CglyZXR1cm4ge29ian07Cn0KCnN0cnVjdCBmb293cmFwcGVyMgp7Cglmb28gY29uc3QmIG9iajsKfTsKCmZvb3dyYXBwZXIyIHByaW50Mihmb28gY29uc3QmIG9iaikKewoJcmV0dXJuIHtvYmp9Owp9CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBsaHMsIGZvb3dyYXBwZXIxIGNvbnN0JiByaHMpCnsKCWxocyA8PCAnKCcgPDwgcmhzLm9iai5uYW1lIDw8ICcpJzsKfQoKc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgbGhzLCBmb293cmFwcGVyMiBjb25zdCYgcmhzKQp7CglsaHMgPDwgJ1snIDw8IHJocy5vYmoubmFtZSA8PCAnXSc7Cn0KCmludCBtYWluKCkKewoJZm9vIGY7CglmLm5hbWUgPSAiYmxhaCI7CgoJc3RkOjpjb3V0IDw8IHByaW50MShmKSA8PCBwcmludDIoZik7Cn0=