C ++ 11 agregó algunas funciones nuevas de conversión de cadenas:
http://en.cppreference.com/w/cpp/string/basic_string/stoul
Incluye stoi (cadena a int), stol (cadena a largo), stoll (cadena a largo largo), stoul (cadena a unsigned long), stoull (cadena a unsigned long long). Notable en su ausencia es una función stou (cadena a unsigned). ¿Hay alguna razón por la que no es necesario, pero todos los demás lo son?
relacionado: ¿ No hay funciones "sto {short, unsigned short}" en C ++ 11?
unsigned long
simplemente es nounsigned int
.unsigned long
es de 64 bits yunsigned int
32. Son de diferentes tipos y no se puede suponer que sean iguales entre sí.stou
una pregunta de "Wah wah, ¿dónde está esa maldita? ", Sino una pregunta que busca una razón posiblemente definida de esta obvia inconsistencia. Si sabe que no existe tal razón, entonces publíquelo como una respuesta.Respuestas:
La respuesta más acertada sería que la biblioteca C no tiene un "
strtou
" correspondiente , y las funciones de cadena de C ++ 11 son sólo envoltorios finos alrededor de las funciones de la biblioteca C: lasstd::sto*
funciones reflejanstrto*
y lasstd::to_string
funciones usansprintf
.Editar: Como señala Kenny TM, ambos
stoi
y elstol
usostrtol
como la función de conversión subyacente, pero aún es misterioso por qué, si bien existestoul
ese usostrtoul
, no hay correspondenciastou
.fuente
boost::lexical_cast<>()
parece una forma más de C ++ de hacer las cosas.sto*
, C ++ 11 21.5 / 1: Efectos: las dos primeras funciones llaman a strtol (str.c_str (), ptr, base), y las últimas tres funciones llaman a strtoul (str.c_str (), ptr, base ), strtoll (str.c_str (), ptr, base) y strtoull (str.c_str (), ptr, base), respectivamente.std::sto*
deben implementarse como envoltorios para las funciones de la biblioteca C, y un programa válido no puede decir que no se implementan en secreto de manera diferente, la implementación es válida.No tengo idea de por qué
stoi
existe, pero nostou
, pero la única diferencia entrestoul
y un hipotéticostou
sería comprobar que el resultado está en el rango deunsigned
:(Del mismo modo,
stoi
también es similar astol
, solo con una verificación de rango diferente; pero como ya existe, no hay necesidad de preocuparse por cómo implementarlo exactamente).fuente
stoi
ystol
, ostol
ystoll
también es solo una verificación de rango.stoi
ystol
, sí. Perostol
ystoll
no solo difieren en la verificación de rango, sino que llaman a diferentes funciones de biblioteca.El uso de máscaras para hacer esto con el tamaño del valor esperado en bits expresado en la máscara hará que esto funcione para longs de 64 bits frente a entradas de 32 bits, pero también para entradas largas de 32 bits frente a entradas de 32 bits.
En el caso de longs de 64 bits, ~ 0xffffffffl se convertirá en 0xffffffff00000000 y, por lo tanto, verá si alguno de los 32 bits principales está configurado. Con longs de 32 bits, ~ 0xffffffffl se convierte en 0x00000000 y la comprobación de la máscara siempre será cero.
fuente