Il existe plusieurs implémentations de la fonction printf des modèles variés. L'un est ceci:Modèles variés et types de sécurité
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");
}
et partout est dit que cette mise en œuvre est le type de sécurité alors que la normale C (avec des arguments variadique va_arg) n'est pas.
Pourquoi est-ce? Qu'est-ce que cela signifie d'être sécurisé et quels sont les avantages de cette implémentation sur C printf va_arg?
Cette version ne se soucie pas du tout des indicateurs de format, elle imprime simplement des choses à travers les opérateurs de flux. – Xeo
Il est de type sécurisé en ce que 'T' sera toujours le type du paramètre effectivement passé. Le standard printf ne sait pas. –
En aparté, c'est une horrible implémentation 'printf' de typesafe.Il ignore et interprète mal les spécificateurs de format, et ne supporte même pas le déplacement de valeurs temporaires! En résumé, il s'agit d'une fonction de typesafe, mais ce n'est pas une implémentation valide de 'printf', malgré son nom. Un bon type 'printf' se comporterait identiquement à' printf' quand il est sûr, et ne fonctionnerait pas indéfini dans la plupart des cas dangereux. – Yakk