C ++ 11 a ajouté de nouvelles fonctions de conversion de chaîne:
http://en.cppreference.com/w/cpp/string/basic_string/stoul
Il inclut stoi (chaîne en entier), stol (chaîne en long), stoll (chaîne en long long), stoul (chaîne en long non signé), stoull (chaîne en long non signé). Notable 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?
Related: Pas de fonctions "sto {short, unsigned short}" dans C ++ 11?
unsigned long
tout est nonunsigned int
.unsigned long
c'est 64 bits etunsigned int
32. Ils sont de types différents et ne peuvent pas être supposés être identiques les uns aux autres.stou
" -question, mais une question demandant une raison peut-être définie pour cette incohérence évidente. Si vous savez qu'il n'y a pas de telle raison, alors postez-la comme réponse.Réponses:
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 finement voilées autour des fonctions de la bibliothèque C: lesstd::sto*
fonctions miroirstrto*
et lesstd::to_string
fonctions utilisentsprintf
.Edit: Comme le souligne KennyTM, les deux
stoi
et l'stol
utilisentstrtol
comme fonction de conversion sous-jacente, mais il est encore mystérieux de savoir pourquoi tant qu'il existe desstoul
utilisationsstrtoul
, il n'y a pas de correspondancestou
.la source
boost::lexical_cast<>()
semble être une façon plus C ++ de faire les choses.sto*
, C ++ 11 21.5 / 1: Effets: les deux premières fonctions appellent strtol (str.c_str (), ptr, base), et les trois dernières fonctions appellent strtoul (str.c_str (), ptr, base ), strtoll (str.c_str (), ptr, base) et strtoull (str.c_str (), ptr, base), respectivement.std::sto*
doit être implémenté comme wrappers pour les fonctions de la bibliothèque C, et un programme valide ne peut pas dire qu'ils ne sont pas secrètement implémentés différemment, l'implémentation est valide.Je ne sais pas pourquoi
stoi
existe mais passtou
, mais la seule différence entrestoul
et une hypothétiquestou
serait de vérifier que le résultat est dans la plage deunsigned
:(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 s'inquiéter de la manière exacte de l'implémenter.)la source
stoi
etstol
, oustol
etstoll
n'est également qu'une vérification de plage.stoi
etstol
, oui. Maisstol
etstoll
ne diffèrent pas seulement dans le contrôle de plage, ils appellent différentes fonctions de bibliothèque.L'utilisation de masques pour ce faire avec la taille de la valeur attendue en bits exprimée dans le masque fera que cela fonctionnera pour les entiers 64 bits par rapport aux entiers 32 bits, mais aussi pour les entiers 32 bits et 32 bits.
Dans le cas de longs 64 bits, ~ 0xffffffffl deviendra 0xffffffff00000000 et verra donc si l'un des 32 premiers bits est défini. Avec des longs 32 bits, ~ 0xffffffffl devient 0x00000000 et la vérification du masque sera toujours zéro.
la source