#include <iostream>
#include <stdexcept>
namespace documentation {
struct Page {
char const * text;
};
// Print at printer, costs hundreds of dollars because it's an awesome printer
void print(Page const &) {
throw std::logic_error{"WTF! Who turned on the printer!?!"};
}
// Write on screen
std::ostream & operator<<(std::ostream & s, Page const & p) {
return (s << p.text);
}
}
namespace IO {
template <typename T>
void print(const T& input)
{
std::cout << input << ' ';
}
template <typename T, typename... Types>
void print(const T& firstArg, const Types&... arguments)
{
std::cout << firstArg << ' ';
print(arguments...);
}
}
int main() {
try {
documentation::Page p {"Some nice text"};
IO::print("Introduction: ", p);
} catch (std::exception const & e) {
std::cout << "ERROR: " << e.what() << std::endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKbmFtZXNwYWNlIGRvY3VtZW50YXRpb24gewoJc3RydWN0IFBhZ2UgewoJCWNoYXIgY29uc3QgKiB0ZXh0OwoJfTsKCQoJLy8gUHJpbnQgYXQgcHJpbnRlciwgY29zdHMgaHVuZHJlZHMgb2YgZG9sbGFycyBiZWNhdXNlIGl0J3MgYW4gYXdlc29tZSBwcmludGVyCgl2b2lkIHByaW50KFBhZ2UgY29uc3QgJikgewoJCXRocm93IHN0ZDo6bG9naWNfZXJyb3J7IldURiEgV2hvIHR1cm5lZCBvbiB0aGUgcHJpbnRlciE/ISJ9OwoJfQoJCgkvLyBXcml0ZSBvbiBzY3JlZW4KCXN0ZDo6b3N0cmVhbSAmIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICYgcywgUGFnZSBjb25zdCAmIHApIHsKCQlyZXR1cm4gKHMgPDwgcC50ZXh0KTsKCX0KfQoKbmFtZXNwYWNlIElPIHsKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIHZvaWQgcHJpbnQoY29uc3QgVCYgaW5wdXQpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IGlucHV0IDw8ICcgJzsKICAgIH0KCgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFR5cGVzPgogICAgdm9pZCBwcmludChjb25zdCBUJiBmaXJzdEFyZywgY29uc3QgVHlwZXMmLi4uIGFyZ3VtZW50cykKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgZmlyc3RBcmcgPDwgJyAnOwogICAgICAgIHByaW50KGFyZ3VtZW50cy4uLik7CiAgICB9Cn0KCgppbnQgbWFpbigpIHsKCXRyeSB7CgkJZG9jdW1lbnRhdGlvbjo6UGFnZSBwIHsiU29tZSBuaWNlIHRleHQifTsKCQlJTzo6cHJpbnQoIkludHJvZHVjdGlvbjogIiwgcCk7Cgl9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiBjb25zdCAmIGUpIHsKCQlzdGQ6OmNvdXQgPDwgIkVSUk9SOiAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKCX0KfQ==