132 votes

Pourquoi n'y a-t-il pas de std::stou ?

C++11 a ajouté quelques nouvelles fonctions de conversion de chaînes de caractères :

http://en.cppreference.com/w/cpp/string/basic_string/stoul

Il comprend stoi (chaîne vers int), stol (chaîne vers long), stoll (chaîne vers long long), stoul (chaîne vers long non signé), stoull (chaîne vers long non signé). La fonction stou (string to unsigned) brille par son absence. Y a-t-il une raison pour laquelle elle n'est pas nécessaire alors que toutes les autres le sont ?

liés : Pas de fonctions "sto{short, unsigned short}" en C++11 ?

0 votes

Non constructif, pour la même raison que l'autre question n'est pas constructive.

7 votes

Ma question était plutôt du type "y a-t-il un inconvénient non évident à utiliser simplement stoul". Il est évident que cela va perturber l'instanciation des modèles, mais y a-t-il autre chose que je n'ai pas pris en compte ? Des commentaires sur les raisons de cette omission seraient bienvenus, mais secondaires.

20 votes

@NicolBolas Je ne vois pas en quoi cela n'est pas constructif. C'est une question parfaitement valide car je ne vois pas de raison à cette incohérence et les réponses peuvent donner un aperçu d'une raison valable mais pas si évidente.

42voto

Kerrek SB Points 194696

La réponse la plus simple serait que la bibliothèque C ne possède pas de " strtou "et les fonctions de chaîne C++11 ne sont que des enveloppes à peine voilées des fonctions de la bibliothèque C : Le site std::sto* miroir des fonctions strto* et le std::to_string utilisation des fonctions sprintf .


Edit : Comme KennyTM le souligne, les deux stoi y stol utiliser strtol comme fonction de conversion sous-jacente, mais il est toujours mystérieux de savoir pourquoi, alors qu'il existe stoul qui utilise strtoul il n'y a pas de correspondance stou .

20 votes

Savez-vous pourquoi le comité C++ a décidé d'adopter une approche aussi proche du C ? Quelque chose comme boost::lexical_cast<>() semble être une façon plus C++ de faire les choses.

2 votes

Ces détails de mise en œuvre sont-ils vraiment définis par la norme ?

0 votes

@LightnessRacesinOrbit : Oui, ils le sont.

28voto

Mike Seymour Points 130519

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 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 mais avec une vérification différente de la portée ; mais comme elle existe déjà, il n'y a pas besoin de se préoccuper de la manière exacte de l'implémenter).

0 votes

La différence entre stoi y stol ou stol y stoll n'est également qu'un contrôle de portée.

1 votes

@Hossein : Entre stoi y stol oui. Mais stol y stoll ne diffèrent pas seulement dans la vérification de la portée, ils appellent des fonctions de bibliothèque différentes.

0voto

Gregg Wonderly Points 11
unsigned long ulval = std::stoul(buf);
unsigned long mask = ~0xffffffffl;
unsigned int uival;
if( (ulval & mask) == 0 )
    uival = (unsigned int)ulval;
else {
    ...range error...
}

L'utilisation de masques pour ce faire, avec la taille de la valeur attendue en bits exprimée dans le masque, permettra de fonctionner pour les longs de 64 bits par rapport aux ints de 32 bits, mais aussi pour les longs de 32 bits par rapport aux ints de 32 bits.

Dans le cas de longueurs de 64 bits, ~0xffffffffl deviendra 0xffffff00000000 et verra donc si l'un des 32 bits supérieurs est activé. Dans le cas des longs de 32 bits, il ~0xffffffffl devient 0x00000000 et la vérification du masque sera toujours zéro.

1 votes

Si buf es "0" cela supposera qu'une erreur de plage s'est produite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X