Variadic templates printf işlevinin çeşitli uygulamaları vardır. Her yerdeDeğişken Şablonlar ve Türleri
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");
}
ve bu uygulama güvenli-tip (variadic argümanlar va_arg ile) Normal C değilken olduğu söylenir: birisi bu.
Neden? Tip-güvenli olması ve bu uygulamanın C printf va_arg üzerinde ne gibi avantajları vardır?
Bu sürüm, biçimlendirme bayrakları hakkında hiçbir şey umursamıyor, yalnızca akış işleyicilerinden bir şeyler yazdırıyor. – Xeo
Bu 'T', her zaman gerçekte geçirilen parametrenin tipi olacaktır. Standart printf bilmiyor. –
Bir kenara göre, korkunç bir "printf" uygulamasıdır.Biçim belirleyicileri yok sayar ve yanlış yorumluyor ve hatta geçici değerlerin taşınmasını desteklemiyor! Kısacası, bu tür bir fonksiyondur, fakat ismine rağmen, printf'in geçerli bir uygulaması değildir. İyi bir güvensiz 'printf' güvenli olduğunda 'printf' ile aynı şekilde davranır ve çoğu güvensiz vakada tanımsız olarak başarısız olur. – Yakk