Esistono diverse implementazioni della funzione printf dei modelli variadici. Uno è questo:Modelli variabili e sicurezza tecnica
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");
}
e ovunque è detto che questa implementazione è di tipo-sicuro, mentre la C normale (con argomenti variadic va_arg) non lo è.
Perché è quello? Che cosa significa essere sicuro per il tipo e quali vantaggi ha questa implementazione su un C printf va_arg uno?
Questa versione non si preoccupa affatto dei flag di formato, ma stampa le cose attraverso gli operatori di streaming. – Xeo
È sicuro dal tipo in cui "T" sarà sempre il tipo di parametro effettivamente passato. La stampa standard non lo sa. –
Per inciso, si tratta di un'implementazione orribile 'printf'.Ignora e interpreta erroneamente gli specificatori di formato e non supporta nemmeno lo spostamento di valori temporanei! In breve, è una funzione tipizzata, ma non è un'implementazione valida di 'printf', nonostante il suo nome. Un buon 'tipf' printf' si comporterebbe in modo identico a' printf' quando era sicuro, e non sarebbe riuscito a farlo indefinito quando era nella maggior parte dei casi non sicuri. – Yakk