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?

70
demandé sur Community 2012-01-03 20:21:31

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 .

20
répondu Kerrek SB 2012-01-04 14:38:31

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

19
répondu Mike Seymour 2012-01-03 17:37:38