#include <iostream>
struct LogHelper
{
std::ostream& Target;
LogHelper(std::ostream& Target)
: Target(Target)
{
}
~LogHelper()
{
Target << std::endl;
}
};
template<class T>
std::ostream& operator<< (LogHelper Stream, T const& Rhs)
{
return Stream.Target << Rhs;
}
struct Log
{
std::ostream& Target;
Log(std::ostream& Target)
: Target(Target)
{
}
};
template<class T>
LogHelper operator<< (Log& Stream, T const& Rhs)
{
Stream.Target << Rhs;
return LogHelper(Stream.Target);
}
Log TollesLog(std::cout);
struct UserDefinedType
{
float Lhs, Rhs;
UserDefinedType(float Lhs, float Rhs)
: Lhs(Lhs), Rhs(Rhs)
{
}
};
std::ostream& operator<< (std::ostream& Stream, UserDefinedType const& Rhs)
{
return Stream << '(' << Rhs.Lhs << '|' << Rhs.Rhs << ')';
}
int main()
{
UserDefinedType Var(5, -5);
TollesLog << "Hallo" << ' ' << "Welt" << 123;
TollesLog << "Hallo Welt";
TollesLog << "Mein Typ: " << Var;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgpzdHJ1Y3QgTG9nSGVscGVyCnsKCXN0ZDo6b3N0cmVhbSYgVGFyZ2V0OwoJTG9nSGVscGVyKHN0ZDo6b3N0cmVhbSYgVGFyZ2V0KQoJCTogVGFyZ2V0KFRhcmdldCkKCXsKCX0KCX5Mb2dIZWxwZXIoKQoJewoJCVRhcmdldCA8PCBzdGQ6OmVuZGw7Cgl9Cn07CnRlbXBsYXRlPGNsYXNzIFQ+CnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoTG9nSGVscGVyIFN0cmVhbSwgVCBjb25zdCYgUmhzKQp7CglyZXR1cm4gU3RyZWFtLlRhcmdldCA8PCBSaHM7Cn0Kc3RydWN0IExvZwp7CglzdGQ6Om9zdHJlYW0mIFRhcmdldDsKCUxvZyhzdGQ6Om9zdHJlYW0mIFRhcmdldCkKCQk6IFRhcmdldChUYXJnZXQpCgl7Cgl9Cn07CnRlbXBsYXRlPGNsYXNzIFQ+CkxvZ0hlbHBlciBvcGVyYXRvcjw8IChMb2cmIFN0cmVhbSwgVCBjb25zdCYgUmhzKQp7CglTdHJlYW0uVGFyZ2V0IDw8IFJoczsKCXJldHVybiBMb2dIZWxwZXIoU3RyZWFtLlRhcmdldCk7Cn0KTG9nIFRvbGxlc0xvZyhzdGQ6OmNvdXQpOwpzdHJ1Y3QgVXNlckRlZmluZWRUeXBlCnsKCWZsb2F0IExocywgUmhzOwoJVXNlckRlZmluZWRUeXBlKGZsb2F0IExocywgZmxvYXQgUmhzKQoJCTogTGhzKExocyksIFJocyhSaHMpCgl7Cgl9Cn07CnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoc3RkOjpvc3RyZWFtJiBTdHJlYW0sIFVzZXJEZWZpbmVkVHlwZSBjb25zdCYgUmhzKQp7CglyZXR1cm4gU3RyZWFtIDw8ICcoJyA8PCBSaHMuTGhzIDw8ICd8JyA8PCBSaHMuUmhzIDw8ICcpJzsKfQppbnQgbWFpbigpCnsKCVVzZXJEZWZpbmVkVHlwZSBWYXIoNSwgLTUpOwoJVG9sbGVzTG9nIDw8ICJIYWxsbyIgPDwgJyAnIDw8ICJXZWx0IiA8PCAxMjM7CglUb2xsZXNMb2cgPDwgIkhhbGxvIFdlbHQiOwoJVG9sbGVzTG9nIDw8ICJNZWluIFR5cDogIiA8PCBWYXI7Cn0=