Un comune pezzo di codice che uso per semplice scissione stringa assomiglia a questo:Modi std :: stringstream può impostare il bit di fail/bad?
inline std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
Qualcuno ha detto che questo sarà silenziosamente "rondine" errori che si verificano in std::getline
. E ovviamente sono d'accordo che sia così. Ma mi è venuto in mente che cosa potrebbe andare storto qui nella pratica di cui dovrei preoccuparmi. in fondo tutto si riduce a questo:
inline std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
if(/* what error can I catch here? */) {
// *** How did we get here!? ***
}
return elems;
}
Un stringstream
è sostenuta da una string
, in modo che non devono preoccuparsi di nessuno dei problemi connessi con la lettura da un file. Non è in corso alcuna conversione di tipo in quanto dal getline
si legge semplicemente finché non viene visualizzato il delimitatore di riga o EOF
. Quindi non possiamo ottenere nessuno degli errori che qualcosa come boost::lexical_cast
deve preoccupare.
Semplicemente non riesco a pensare a qualcosa oltre a non riuscire ad allocare abbastanza memoria che potrebbe andare storta, ma questo semplicemente getterà uno std::bad_alloc
molto prima che lo std::getline
abbia luogo anche. Cosa mi manca?
Ciò che è sbagliato è restituire un riferimento a un locale. – UncleBens
Buona cattura, anche se non intendevo restituire un riferimento a un locale, questo è un esempio ridotto per dimostrare le basi della domanda –
Un 'stringstream' è supportato da una' stringa' solo se non hai chiamato 'rdbuf (otherstreambuf)'. –