¿Por qué no hay std:: stou?


C++11 agregó algunas nuevas funciones de conversión de cadenas:

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

Incluye stoi (string to int), stol (string to long), stoll (string to long long), stoul (string to unsigned long), stoull (string to unsigned long long). Notable en su ausencia es una función stou (string to unsigned). ¿Hay alguna razón por la que no es necesario pero todos los demás lo son?

Relacionado: No " sto{corto, corto sin signo}" funciones en C++11?

Author: Community, 2012-01-03

2 answers

La respuesta más pat sería que la biblioteca de C no tiene "strtou" correspondiente, y las funciones de cadena de C++11 son todas envolturas ligeramente veladas alrededor de las funciones de la biblioteca de C: Las funciones std::sto* espejo strto*, y las funciones std::to_string usan sprintf.


Editar: Como KennyTM señala, tanto stoi como stol usan strtol como la función de conversión subyacente, pero todavía es misterioso por qué mientras existe stoul que usa strtoul, no hay stou correspondiente.

 20
Author: Kerrek SB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-04 14:38:31

No tengo idea de por qué existe stoi pero no stou, pero la única diferencia entre stoul y un hipotético stou sería una comprobación de que el resultado está en el rango 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;
}

(Del mismo modo, stoi también es similar a stol, solo que con una verificación de rango diferente; pero como ya existe, no hay necesidad de preocuparse por exactamente cómo implementarlo.)

 19
Author: Mike Seymour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-03 17:37:38