web-dev-qa-db-fra.com

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

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?

88
David Stone

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.

26
Kerrek SB

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.)

21
Mike Seymour