#include <iostream>
using namespace std;
struct clear_line { } cls;
class out {
private:
std::ostream &strm = std::cout;
bool is_next_clear = false;
public:
template <typename T>
out& operator<<(const T& obj) {
if(is_next_clear) {
strm << std::endl << std::endl << std::endl; // clear logic
is_next_clear = false;
}
strm << obj;
return *this;
}
out& operator<<(const clear_line& _) {
is_next_clear = true;
return *this;
}
// this is the type of std::cout
typedef std::basic_ostream<char, std::char_traits<char> > CoutType;
// this is the function signature of std::endl
typedef CoutType& (*StandardEndLine)(CoutType&);
// define an operator<< to take in std::endl
out& operator<<(StandardEndLine manip)
{
// call the function, but we cannot return its value
manip(strm);
return *this;
}
};
int main() {
out o;
o << "Some real output" << std::endl << "More..." << cls;
o << "Some other real output";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IGNsZWFyX2xpbmUgeyB9IGNsczsKCmNsYXNzIG91dCB7CnByaXZhdGU6CglzdGQ6Om9zdHJlYW0gJnN0cm0gPSBzdGQ6OmNvdXQ7Cglib29sIGlzX25leHRfY2xlYXIgPSBmYWxzZTsKcHVibGljOgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CglvdXQmIG9wZXJhdG9yPDwoY29uc3QgVCYgb2JqKSB7CgkJaWYoaXNfbmV4dF9jbGVhcikgewoJCQlzdHJtIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOyAvLyBjbGVhciBsb2dpYwoJCQlpc19uZXh0X2NsZWFyID0gZmFsc2U7CgkJfQoJCQoJCXN0cm0gPDwgb2JqOwoJCXJldHVybiAqdGhpczsKCX0KCQoJb3V0JiBvcGVyYXRvcjw8KGNvbnN0IGNsZWFyX2xpbmUmIF8pIHsKCQlpc19uZXh0X2NsZWFyID0gdHJ1ZTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgkKCS8vIHRoaXMgaXMgdGhlIHR5cGUgb2Ygc3RkOjpjb3V0CiAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+ID4gQ291dFR5cGU7CgkKICAgIC8vIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiBzdGQ6OmVuZGwKICAgIHR5cGVkZWYgQ291dFR5cGUmICgqU3RhbmRhcmRFbmRMaW5lKShDb3V0VHlwZSYpOwogICAgCiAgICAvLyBkZWZpbmUgYW4gb3BlcmF0b3I8PCB0byB0YWtlIGluIHN0ZDo6ZW5kbAogICAgb3V0JiBvcGVyYXRvcjw8KFN0YW5kYXJkRW5kTGluZSBtYW5pcCkKICAgIHsKICAgICAgICAvLyBjYWxsIHRoZSBmdW5jdGlvbiwgYnV0IHdlIGNhbm5vdCByZXR1cm4gaXRzIHZhbHVlCiAgICAgICAgbWFuaXAoc3RybSk7CgogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KfTsKCmludCBtYWluKCkgewoJb3V0IG87CglvIDw8ICJTb21lIHJlYWwgb3V0cHV0IiA8PCBzdGQ6OmVuZGwgPDwgIk1vcmUuLi4iIDw8IGNsczsKCW8gPDwgIlNvbWUgb3RoZXIgcmVhbCBvdXRwdXQiOwoJCglyZXR1cm4gMDsKfQ==