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 longsimplemente es nounsigned int.unsigned longes de 64 bits yunsigned int32. Son de diferentes tipos y no se puede suponer que sean iguales entre sí.stouuna 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_stringfunciones usansprintf.Editar: Como señala Kenny TM, ambos
stoiy elstolusostrtolcomo la función de conversión subyacente, pero aún es misterioso por qué, si bien existestoulese 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é
stoiexiste, pero nostou, pero la única diferencia entrestouly un hipotéticostousería comprobar que el resultado está en el rango deunsigned:(Del mismo modo,
stoitambié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
stoiystol, ostolystolltambién es solo una verificación de rango.stoiystol, sí. Perostolystollno 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