可变参数模板 printf 函数有多种实现。一个是这样的:
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 相比,这种实现有什么优势?