C++ 11 a ajouté de nouvelles fonctions de conversion de chaînes:
http://en.cppreference.com/w/cpp/string/basic_string/stoul
Il comprend stoi (chaîne à int), stol (chaîne à long), stoll (chaîne à long long), stoul (chaîne à long non signé), stoull (chaîne à long non signé long). Remarquable en son absence est une fonction stou (chaîne à non signée). Y a-t-il une raison pour laquelle ce n'est pas nécessaire, mais toutes les autres le sont?
connexes: Pas de fonctions "sto {short, unsigned short}" en C++ 11?
La réponse la plus évidente serait que la bibliothèque C n'a pas de "strtou
" correspondant, et les fonctions de chaîne C++ 11 ne sont que des enveloppes à peine voilées autour des fonctions de la bibliothèque C: le std::sto*
fonctions miroir strto*
, et le std::to_string
les fonctions utilisent sprintf
.
Edit: Comme le souligne KennyTM, stoi
et stol
utilisent strtol
comme fonction de conversion sous-jacente, mais il est encore mystérieux pourquoi, alors qu'il existe stoul
, que utilise strtoul
, il n'y a pas de stou
correspondant.
Je ne sais pas pourquoi stoi
existe mais pas stou
, mais la seule différence entre stoul
et une hypothétique stou
serait une vérification que le résultat est dans la plage 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 une vérification de plage différente; mais comme il existe déjà, il n'est pas nécessaire de se soucier de la façon exacte de l'implémenter.)