Общий фрагмент кода, который я использую для простого разбиения строк, выглядит следующим образом:
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;
}
Кто-то упомянул, что это беззвучно "проглотит" ошибки, возникающие в std::getline
. И, конечно, я согласен с этим. Но мне пришло в голову, что здесь может пойти не так, как надо, на практике, о котором мне нужно будет беспокоиться. в основном все сводится к следующему:
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;
}
A stringstream
поддерживается string
, поэтому нам не нужно беспокоиться о каких-либо проблемах, связанных с чтением из файла. Здесь нет преобразования типов, так как getline
просто читает, пока не увидит линейный делитель или EOF
. Таким образом, мы не можем получить какие-либо ошибки, о которых должно беспокоиться что-то вроде boost::lexical_cast
.
Я просто не могу думать о чем-то, кроме того, что не смог выделить достаточно памяти, которая может пойти не так, но это просто выбросит std::bad_alloc
задолго до того, как произойдет std::getline
. Что мне не хватает?