Pourquoi n'y a-t-il pas de std::stou?
C++11 a ajouté de nouvelles fonctions de conversion de chaîne:
http://en.cppreference.com/w/cpp/string/basic_string/stoul
Il comprend stoi (string int), stol (chaîne de caractères de long), stoll (chaîne de caractères de long), stoul (chaîne de caractères de type unsigned long), stoull (chaîne unsigned long long). Une fonction stou (string to unsigned) est remarquable en son absence. Est-il une raison quelconque, il n'est pas nécessaire, mais tous les autres sont?
related: Non "sto{short, unsigned short}" de fonctions en C++11?
2 réponses
la réponse la plus évidente serait que la bibliothèque C n'a pas de strtou
correspondant, et que les fonctions C++11 string sont toutes des enveloppements à peine voilés autour des fonctions de la bibliothèque C: les fonctions std::sto*
miroir strto*
, et les fonctions std::to_string
utilisent sprintf
.
Edit: Comme KennyTM points, les deux stoi
et stol
utiliser strtol
sous-jacents de la fonction de conversion, mais il est encore mystérieux pourquoi alors qu'il existe stoul
qui utilise strtoul
, il n'y a pas correspondant stou
.
Je ne sais pas pourquoi stoi
existe mais pas stou
, mais la seule différence entre stoul
et un hypothétique stou
serait un contrôle que le résultat est dans la gamme de unsigned
:
unsigned stou(std::string const & str, size_t * idx = 0, int base = 10) {
unsigned long result = std::stoul(str, idx, base);
if (result > std::numeric_limits<unsigned>::max()) {
throw std::out_of_range("stou");
}
return result;
}
(de même, stoi
est également similaire à stol
, juste avec un contrôle de portée différent; mais puisqu'il existe déjà, il n'y a pas besoin de se soucier de la façon exacte de le mettre en œuvre.)