#include <iostream>
namespace with_spaces {
namespace detail {
std::ostream& print(std::ostream& os) {
return os;
}
template <typename T>
std::ostream& print(std::ostream& os, T&& t) {
return os << std::forward<T>(t);
}
template <typename T, typename U, typename... Args>
std::ostream& print(std::ostream& os, T&& t, U&& u, Args&&... args) {
return print(print(os, std::forward<T>(t)) << ' ', std::forward<U>(u), std::forward<Args>(args)...);
}
}
template <typename... Args>
void print(Args&&... args) {
detail::print(std::cout, std::forward<Args>(args)...) << std::endl;
}
}
namespace without {
namespace detail {
std::ostream& print(std::ostream& os) {
return os;
}
template <typename T>
std::ostream& print(std::ostream& os, T&& t) {
return os << std::forward<T>(t);
}
template <typename T, typename... Args>
std::ostream& print(std::ostream& os, T&& t, Args&&... args) {
return print(print(os, std::forward<T>(t)), std::forward<Args>(args)...);
}
}
template <typename... Args>
void print(Args&&... args) {
detail::print(std::cout, std::forward<Args>(args)...) << std::endl;
}
}
#include <iomanip>
int main() {
std::cout << std::boolalpha;
with_spaces::print(1, "foo", new int(3), 0xFFFFFFFFFFULL, 42, 0 == 1);
without::print(1, "foo", new int(3), 0xFFFFFFFFFFULL, 42, 0 == 1);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKbmFtZXNwYWNlIHdpdGhfc3BhY2VzIHsKCm5hbWVzcGFjZSBkZXRhaWwgewpzdGQ6Om9zdHJlYW0mIHByaW50KHN0ZDo6b3N0cmVhbSYgb3MpIHsKICAgIHJldHVybiBvczsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0ZDo6b3N0cmVhbSYgcHJpbnQoc3RkOjpvc3RyZWFtJiBvcywgVCYmIHQpIHsKICAgIHJldHVybiBvcyA8PCBzdGQ6OmZvcndhcmQ8VD4odCk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBBcmdzPgpzdGQ6Om9zdHJlYW0mIHByaW50KHN0ZDo6b3N0cmVhbSYgb3MsIFQmJiB0LCBVJiYgdSwgQXJncyYmLi4uIGFyZ3MpIHsKICAgIHJldHVybiBwcmludChwcmludChvcywgc3RkOjpmb3J3YXJkPFQ+KHQpKSA8PCAnICcsIHN0ZDo6Zm9yd2FyZDxVPih1KSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKfQp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4Kdm9pZCBwcmludChBcmdzJiYuLi4gYXJncykgewogICAgZGV0YWlsOjpwcmludChzdGQ6OmNvdXQsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikgPDwgc3RkOjplbmRsOwp9Cn0KCm5hbWVzcGFjZSB3aXRob3V0IHsKbmFtZXNwYWNlIGRldGFpbCB7CnN0ZDo6b3N0cmVhbSYgcHJpbnQoc3RkOjpvc3RyZWFtJiBvcykgewogICAgcmV0dXJuIG9zOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RkOjpvc3RyZWFtJiBwcmludChzdGQ6Om9zdHJlYW0mIG9zLCBUJiYgdCkgewogICAgcmV0dXJuIG9zIDw8IHN0ZDo6Zm9yd2FyZDxUPih0KTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CnN0ZDo6b3N0cmVhbSYgcHJpbnQoc3RkOjpvc3RyZWFtJiBvcywgVCYmIHQsIEFyZ3MmJi4uLiBhcmdzKSB7CiAgICByZXR1cm4gcHJpbnQocHJpbnQob3MsIHN0ZDo6Zm9yd2FyZDxUPih0KSksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Cn0KfQoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CnZvaWQgcHJpbnQoQXJncyYmLi4uIGFyZ3MpIHsKICAgIGRldGFpbDo6cHJpbnQoc3RkOjpjb3V0LCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pIDw8IHN0ZDo6ZW5kbDsKfQp9CgojaW5jbHVkZSA8aW9tYW5pcD4KCmludCBtYWluKCkgewogICAgc3RkOjpjb3V0IDw8IHN0ZDo6Ym9vbGFscGhhOwogICAgd2l0aF9zcGFjZXM6OnByaW50KDEsICJmb28iLCBuZXcgaW50KDMpLCAweEZGRkZGRkZGRkZVTEwsIDQyLCAwID09IDEpOwogICAgd2l0aG91dDo6cHJpbnQoMSwgImZvbyIsIG5ldyBpbnQoMyksIDB4RkZGRkZGRkZGRlVMTCwgNDIsIDAgPT0gMSk7Cn0K