#include <iostream>
#include <stdexcept>
namespace cpp {
void printf(const char* s)
{
while (*s) {
if (*s == '%' && *++s != '%')
throw std::runtime_error("invalid format string: missing arguments");
std::cout << *s++;
}
}
template<typename T, typename... Args>
void printf(const char* s, const T& value, const Args&... args)
{
while (*s) {
if (*s == '%' && *++s != '%') {
std::cout << value;
return printf(++s, args...);
}
std::cout << *s++;
}
throw std::runtime_error("extra arguments provided to printf");
}
} // namespace cpp
int main()
{
// classic printf
printf("%u\n", -1);
// C++ variadic printf
cpp::printf("%u\n", -1);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKbmFtZXNwYWNlIGNwcCB7Cgp2b2lkIHByaW50Zihjb25zdCBjaGFyKiBzKQp7CiAgd2hpbGUgKCpzKSB7CiAgICBpZiAoKnMgPT0gJyUnICYmICorK3MgIT0gJyUnKSAKICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJpbnZhbGlkIGZvcm1hdCBzdHJpbmc6IG1pc3NpbmcgYXJndW1lbnRzIik7CiAgICBzdGQ6OmNvdXQgPDwgKnMrKzsKICB9Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CnZvaWQgcHJpbnRmKGNvbnN0IGNoYXIqIHMsIGNvbnN0IFQmIHZhbHVlLCBjb25zdCBBcmdzJi4uLiBhcmdzKQp7CiAgd2hpbGUgKCpzKSB7CiAgICBpZiAoKnMgPT0gJyUnICYmICorK3MgIT0gJyUnKSB7CiAgICAgIHN0ZDo6Y291dCA8PCB2YWx1ZTsKICAgICAgcmV0dXJuIHByaW50ZigrK3MsIGFyZ3MuLi4pOwogICAgfQogICAgc3RkOjpjb3V0IDw8ICpzKys7CiAgfQogIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiZXh0cmEgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHByaW50ZiIpOwp9Cgp9IC8vIG5hbWVzcGFjZSBjcHAKCmludCBtYWluKCkKewogICAgLy8gY2xhc3NpYyBwcmludGYKICAgIHByaW50ZigiJXVcbiIsIC0xKTsKICAgICAgIAogICAgLy8gQysrIHZhcmlhZGljIHByaW50ZgogICAgY3BwOjpwcmludGYoIiV1XG4iLCAtMSk7Cn0=