2012-01-03 11 views
66

C++ 11 aggiungono alcune nuove funzioni di conversione stringa:Perché non c'è std :: stou?

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

Include stoi (stringa a int), stol (stringa di lunghezza), stoll (stringa da lungo tempo), stoul (stringa unsigned long), stoull (stringa a unsigned long long). Notevole in sua assenza è una funzione stou (stringa a non firmata). C'è qualche ragione per cui non è necessario, ma tutti gli altri sono?

correlati: No "sto{short, unsigned short}" functions in C++11?

+0

Non costruttivo, per la stessa ragione per cui l'altra domanda non è costruttiva. –

+5

La mia domanda doveva essere più simile a "c'è qualche svantaggio non ovvio di usare solo stoul". Ovviamente questo pasticcia con l'istanziazione del template, ma c'è qualcos'altro che non sto considerando? Commenti sul motivo per cui è stato lasciato fuori sarebbe carino ma secondario. –

+9

@NicolBolas Non riesco a capire perché non sia costruttivo. È una domanda perfettamente valida in quanto non riesco a vedere alcuna ragione per questa incoerenza e gli autori possono dare delle intuizioni su alcune valide ragioni valide ma non ovvie. –

risposta

20

La risposta più pat sarebbe che la libreria C non ha alcun corrispondente “ strtou ”, e le C++ 11 funzioni stringa sono tutti gli involucri appena velate intorno alle funzioni di libreria C: Le std::sto* funzioni rispecchiano strto*, e il std::to_string le funzioni utilizzano sprintf.


Edit: Come KennyTM sottolinea, sia stoi e stol uso strtol la funzione di conversione di base, ma è ancora misterioso perché mentre esiste stoul che utilizza strtoul, non corrisponde un stou.

+10

Sai perché il comitato del C++ ha deciso di adottare un approccio C-ish? Qualcosa come "boost :: lexical_cast <>()" sembra un modo più C++ di fare le cose. –

+2

Questi dettagli di implementazione sono veramente definiti in base allo standard? –

+0

@LightnessRacesinOrbit: Sì, lo sono. –

18

Non ho idea del perché stoi esiste ma non stou, ma l'unica differenza tra stoul e un ipotetico stou sarebbe un assegno che il risultato sia nella gamma di 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; 
} 

(Allo stesso modo, stoi è simile a stol, con un controllo di intervallo diverso, ma poiché esiste già, non è necessario preoccuparsi esattamente di come implementarlo.)

+0

La differenza tra 'stoi' e' stol', o 'stol' e' stoll' è anche solo un controllo di intervallo. – Hossein

+1

@Hossein: tra 'stoi' e' stol', si. Ma 'stol' e' stoll' non differiscono solo per il controllo di intervallo, chiamano diverse funzioni di libreria. –

Problemi correlati