C ++ 11 adicionou algumas novas funções de conversão de string:
http://en.cppreference.com/w/cpp/string/basic_string/stoul
Inclui stoi (string para int), stol (string para long), stoll (string para long long), stoul (string para long sem sinal), stoull (string para long long sem sinal). Notável em sua ausência é uma função stou (string para não assinado). Existe algum motivo pelo qual não é necessário, mas todos os outros são?
related: Sem funções "sto {short, unsigned short}" em C ++ 11?
unsigned long
simplesmente não éunsigned int
.unsigned long
tem 64 bits eunsigned int
32. Eles são tipos diferentes e não podem ser considerados iguais.stou
uma pergunta "Wah wah, onde está essa porcaria ", mas de uma pergunta que pede uma razão possivelmente definitiva para essa inconsistência óbvia. Se você sabe que não existe esse motivo, então, poste como uma resposta.Respostas:
A resposta mais apropriada seria que a biblioteca C não tem “
strtou
” correspondente , e as funções de string do C ++ 11 são apenas envoltórios velados em torno das funções da biblioteca C: asstd::sto*
funções espelhamstrto*
e asstd::to_string
funções usamsprintf
.Edit: Como KennyTM aponta, ambos
stoi
estol
usamstrtol
como a função de conversão subjacente, mas ainda é misterioso por que enquanto existestoul
esse usastrtoul
, não há correspondentestou
.fonte
boost::lexical_cast<>()
parece uma maneira mais C ++ de fazer as coisas.sto*
, C ++ 11 21.5 / 1: Effects: as duas primeiras funções chamam strtol (str.c_str (), ptr, base) e as três últimas funções chamam strtoul (str.c_str (), ptr, base ), strtoll (str.c_str (), ptr, base) e strtoull (str.c_str (), ptr, base), respectivamente.std::sto*
deve ser implementado como wrappers para as funções da biblioteca C, e um programa válido não pode dizer que eles não são secretamente implementados de forma diferente, a implementação é válida.Não tenho ideia de por que
stoi
existe, mas não existestou
, mas a única diferença entrestoul
e um hipotéticostou
seria uma verificação de que o resultado está na faixa deunsigned
:(Da mesma forma,
stoi
também é semelhante astol
, apenas com uma verificação de intervalo diferente; mas, uma vez que já existe, não há necessidade de se preocupar exatamente como implementá-lo.)fonte
stoi
estol
, oustol
estoll
também é apenas uma verificação de intervalo.stoi
estol
, sim. Masstol
estoll
não diferem apenas na verificação de alcance, eles chamam diferentes funções de biblioteca.Usar máscaras para fazer isso com o tamanho do valor esperado em bits expresso na máscara fará com que funcione para longs de 64 bits vs ints de 32 bits, mas também para longs de 32 bits vs ints de 32 bits.
No caso de longos de 64 bits, ~ 0xffffffffl se tornará 0xffffffff00000000 e, portanto, verá se algum dos 32 bits principais está definido. Com longs de 32 bits, ~ 0xffffffffl torna-se 0x00000000 e a verificação da máscara sempre será zero.
fonte