#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;
}