可変個引数テンプレートの printf 関数にはいくつかの実装があります。1つはこれです:
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");
}
そして、この実装はタイプセーフであると言われていますが、通常の C (可変引数 va_arg を持つ) はそうではありません。
何故ですか?タイプセーフであるとはどういう意味ですか? また、この実装には C の printf va_arg よりも優れている点は何ですか?