2012-01-03 12 views
66

C++ 11 añadido algunas nuevas funciones de conversión de cadena:¿Por qué no hay std :: stou?

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

Incluye Stoi (cadena a INT), STOL (cadena a largo), Stoll (cadena a largo de largo), stoul (cadena de unsigned long), stoull (string a unsigned long long). Notable en su ausencia es una función stou (cadena a sin firmar). ¿Hay alguna razón por la que no se necesita pero todos los demás sí?

relacionados: No "sto{short, unsigned short}" functions in C++11?

+0

No es constructivo, por la misma razón que la otra pregunta no es constructiva. –

+5

Mi pregunta estaba destinada a ser más en la línea de "¿hay algún inconveniente no obvio de simplemente usar Stoul". Obviamente eso interferirá con la creación de instancias de plantillas, pero ¿hay algo más que no esté considerando? Los comentarios sobre por qué se dejó afuera serían buenos pero secundarios. –

+9

@NicolBolas No veo por qué esto no es constructivo. Es una pregunta perfectamente válida, ya que no puedo ver ninguna razón para esta incoherencia y las respuestas pueden dar una idea de alguna posible razón válida pero no tan obvia para ello. –

Respuesta

20

La respuesta más pat sería que la biblioteca de C no tiene la correspondiente “ ” strtou, y los C++ 11 funciones de cadena son todos envolturas simplemente veladas en torno a las funciones de la biblioteca C: Las funciones std::sto* espejo strto* y el std::to_string las funciones usan sprintf.


Edit: Como KennyTM señala, tanto stoi y stol uso strtol como la función de conversión subyacente, pero sigue siendo un misterio por qué, mientras que existe stoul que utiliza strtoul, no hay stou correspondiente.

+10

¿Sabes por qué el Comité C++ decidió aplicar un enfoque C-ish? Algo como 'boost :: lexical_cast <>()' parece una forma más C++ de hacer las cosas. –

+2

¿Están estos detalles de implementación realmente definidos de manera estándar? –

+0

@LightnessRacesinOrbit: Sí, lo son. –

18

tengo ni idea de por qué existe stoi pero no stou, pero la única diferencia entre stoul y una hipotética 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 es también similar a stol, solo con una comprobación de rango diferente, pero como ya existe, no hay necesidad de preocuparse acerca de cómo implementarlo exactamente)

+0

La diferencia entre 'stoi' y' stol', o 'stol' y' stoll' también es solo una verificación de rango. – Hossein

+1

@Hossein: entre 'stoi' y' stol', sí. Pero 'stol' y' stoll' no se diferencian solo en la comprobación de rango, sino que invocan diferentes funciones de biblioteca. –

Cuestiones relacionadas