#include <iostream>
void typesafe_printf(const char* format) // Rekursionsende des Templates
{
while (*format) {
if (*format == '%') {
throw std::runtime_error("Mehr Platzhalter als Parameter");
}
std::cout << *format++;
}
};
template<typename T, typename... Rest>
void typesafe_printf(const char* format, T param, Rest... params)
{
while (*format) {
if (*format == '%') {
std::cout << param;
format++;
typesafe_printf(format, params...);
return;
}
std::cout << *format++;
}
};
#include <string>
#include <complex>
int main()
{
typesafe_printf("Ein char: %, viele chars: %, ein string: %, ein int: %, ein double: %, ein complex: %",
'a', "abc", std::string("blah"), 123, 123.123, std::complex<double>(20.2,2.5)
);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdm9pZCB0eXBlc2FmZV9wcmludGYoY29uc3QgY2hhciogZm9ybWF0KSAvLyBSZWt1cnNpb25zZW5kZSBkZXMgVGVtcGxhdGVzCnsKICAgIHdoaWxlICgqZm9ybWF0KSB7CiAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyUnKSB7CiAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiTWVociBQbGF0emhhbHRlciBhbHMgUGFyYW1ldGVyIik7CiAgICAgICAgfQogICAgICAgIHN0ZDo6Y291dCA8PCAqZm9ybWF0Kys7CiAgICB9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBSZXN0Pgp2b2lkIHR5cGVzYWZlX3ByaW50Zihjb25zdCBjaGFyKiBmb3JtYXQsIFQgcGFyYW0sIFJlc3QuLi4gcGFyYW1zKSAKewogICAgd2hpbGUgKCpmb3JtYXQpIHsKICAgICAgICBpZiAoKmZvcm1hdCA9PSAnJScpIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHBhcmFtOwogICAgICAgICAgICBmb3JtYXQrKzsKICAgICAgICAgICAgdHlwZXNhZmVfcHJpbnRmKGZvcm1hdCwgcGFyYW1zLi4uKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzdGQ6OmNvdXQgPDwgKmZvcm1hdCsrOwogICAgfQp9OwoKCiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxjb21wbGV4PgoKaW50IG1haW4oKQp7Cgl0eXBlc2FmZV9wcmludGYoIkVpbiBjaGFyOiAlLCB2aWVsZSBjaGFyczogJSwgZWluIHN0cmluZzogJSwgZWluIGludDogJSwgZWluIGRvdWJsZTogJSwgZWluIGNvbXBsZXg6ICUiLAoJJ2EnLCAiYWJjIiwgc3RkOjpzdHJpbmcoImJsYWgiKSwgMTIzLCAxMjMuMTIzLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPigyMC4yLDIuNSkKCSk7Cn0=