2012-01-03 25 views
66

C++ 11 dodano kilka nowych funkcji konwersji wyrażenie:Dlaczego nie ma std :: stou?

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

Obejmuje Stoi (string do int), Stol (ciąg długo) Stoll (string na long long), stoul (ciąg unsigned long), stoull (ciąg znaków do unsigned long long). Zauważalny przy jego braku jest funkcja stou (ciąg do unsigned). Czy jest jakiś powód, dla którego nie jest potrzebny, ale wszystkie inne są?

związane: No "sto{short, unsigned short}" functions in C++11?

+0

Nie jest konstruktywny, z tego samego powodu, dla którego inne pytanie nie jest konstruktywne. –

+5

Moje pytanie miało być bardziej zbliżone do linii "czy jest jakaś nieoczywista wada po prostu używając stoul". Oczywiście, że bałagan z instancją szablonów, ale czy jest coś jeszcze, czego nie rozważam? Komentarze na temat tego, dlaczego zostały pominięte, byłyby miłe, ale drugorzędne. –

+9

@NicolBolas Nie widzę powodu, dla którego nie jest to konstruktywne. Jest to doskonale uzasadnione pytanie, ponieważ nie widzę żadnego powodu tej niespójności, a anwers może dać wgląd w niektóre z możliwych istniejących, ale nie oczywistych powodów. –

Odpowiedz

20

Najbardziej pat odpowiedź będzie, że biblioteka C ma odpowiednią “ strtou ”, a C++ 11 Funkcje łańcuchowe są tylko słabo zawoalowane obwolut wokół funkcji bibliotecznych C: std::sto* funkcje lustro strto* i std::to_string funkcje używają sprintf.


Edit: Jak KennyTM wskazuje zarówno stoi i stol korzystanie strtol jako podstawowej funkcji konwersji, ale wciąż jest tajemniczy dlaczego gdy istnieje stoul który używa strtoul, nie ma odpowiedniego stou.

+10

Czy wiesz, dlaczego Komitet C++ zdecydował się na takie podejście C-ish? Coś jak 'boost :: lexical_cast <>()' wydaje się być bardziej C++ sposobem robienia rzeczy. –

+2

Czy te szczegóły implementacji są naprawdę zdefiniowane przez standard? –

+0

@LightnessRacesinOrbit: Tak, są. –

18

nie mam pojęcia dlaczego stoi istnieje, ale nie stou, ale jedyną różnicą pomiędzy stoul i hipotetycznej stou byłoby sprawdzić, czy wynik jest w przedziale 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; 
} 

(Podobnie, stoi jest również podobny do stol, tylko z inną kontrolą zasięgu, ale ponieważ już istnieje, nie trzeba się martwić o dokładnie, jak go zaimplementować.)

+0

Różnica między 'stoi' i' stol' lub 'stol' i' stoll' jest również tylko sprawdzianem zakresu. – Hossein

+1

@Hossein: Pomiędzy 'stoi' i' stol', tak. Ale 'stol' i' stoll' nie różnią się jedynie sprawdzaniem zasięgu, wywołują różne funkcje biblioteczne. –

Powiązane problemy