C ++ 11 dodał kilka nowych funkcji konwersji ciągów:
http://en.cppreference.com/w/cpp/string/basic_string/stoul
Zawiera stoi (ciąg do wartości typu int), stol (ciąg do długości długiej), stoll (ciąg do długości długiej bez znaku), stoul (ciąg do długości bez znaku), stoull (ciąg do długości bez znaku). W przypadku jego braku godna uwagi jest funkcja stou (ciąg bez znaku). Czy jest jakiś powód, dla którego nie jest to potrzebne, a wszystkie inne są?
related: Brak funkcji „sto {short, unsigned short}” w C ++ 11?
unsigned long
prostu nieunsigned int
.unsigned long
ma 64 bity iunsigned int
32 bity. Są to różne typy i nie można zakładać, że są takie same.stou
pytanie „Wah wah, gdzie jest to cholerne ”, ale pytanie o możliwie określony powód tej oczywistej niespójności. Jeśli wiesz , że nie ma takiego powodu, to napisz jako odpowiedź.Odpowiedzi:
Najprostszą odpowiedzią byłoby to, że biblioteka C nie ma odpowiadającego jej znaku „
strtou
”, a funkcje łańcuchowe w C ++ 11 są tylko cienko zawoalowanymi opakowaniami wokół funkcji biblioteki C:std::sto*
lustro funkcjistrto*
istd::to_string
funkcje używanesprintf
.Edycja: Jak wskazuje Kenny TM, oba
stoi
istol
używajstrtol
jako podstawowej funkcji konwersji, ale wciąż jest tajemnicze, dlaczego skoro istnieje,stoul
który używastrtoul
, nie ma odpowiednikastou
.źródło
boost::lexical_cast<>()
wydaje się być bardziej C ++ sposobem robienia rzeczy.sto*
, C ++ 11 21.5 / 1: Efekty: pierwsze dwie funkcje wywołują strtol (str.c_str (), ptr, base), a ostatnie trzy funkcje wywołują strtoul (str.c_str (), ptr, base ), strtoll (str.c_str (), ptr, base) i strtoull (str.c_str (), ptr, base).std::sto*
musi być zaimplementowany jako otoki dla funkcji biblioteki C, i prawidłowy program nie może powiedzieć, że nie są one potajemnie zaimplementowane inaczej, implementacja jest poprawna.Nie mam pojęcia, dlaczego
stoi
istnieje, ale niestou
, ale jedyną różnicą międzystoul
a hipotetycznymstou
byłoby sprawdzenie, czy wynik mieści się w zakresieunsigned
:(Podobnie
stoi
jest równieżstol
z innym sprawdzaniem zakresu, ale ponieważ już istnieje, nie trzeba się martwić, jak dokładnie to zaimplementować).źródło
stoi
istol
lubstol
istoll
jest również tylko sprawdzeniem zakresu.stoi
astol
, tak. Alestol
istoll
nie różnią się tylko sprawdzaniem zakresu, wywołują różne funkcje biblioteki.Użycie masek do zrobienia tego z oczekiwanym rozmiarem wartości w bitach wyrażonym w masce sprawi, że będzie to działać dla 64-bitowych długości w porównaniu z 32-bitowymi liczbami int, ale także dla 32-bitowych długości w porównaniu z 32-bitowymi liczbami int.
W przypadku długości 64-bitowych, ~ 0xffffffffl zmieni się na 0xffffffff00000000 i sprawdzi, czy któryś z 32 górnych bitów jest ustawiony. Przy długościach 32-bitowych ~ 0xffffffffl staje się 0x00000000, a kontrola maski zawsze będzie wynosić zero.
źródło