Одной из очевидных альтернатив будет ваше operator>>
построчное чтение, так что вам не нужно делать это внешне:
class MyClass {
// some sort of data to demonstrate the idea:
int x;
std::string y;
friend std::istream &operator>>(std::istream &is, MyClass &m) {
std::string temp;
std::getline(is, temp);
std::istringstream buffer(temp);
buffer >> m.x >> m.y;
return is;
}
};
При этом код для чтения данныхиз файла становится немного более простым:
std::copy(std::istream_iterator<MyClass>(fullStream),
std::istream_iterator<MyClass>(),
std::back_inserter(result));
Редактировать: если вы не хотите встроить линейно-ориентированное чтение непосредственно в operator>>
для MyClass
, другой возможностью является использованиепрокси-класс:
class LineReader {
MyClass object;
public:
operator MyClass() { return object; }
friend std::istream &operator>>(std::istream &is, LineReader &d) {
std::string line;
std::getline(is, line);
std::istringstream buffer(line);
buffer >> d; // delegate to the object's own stream-oriented reader.
}
};
Затем, когда вы хотите выполнить линейно-ориентированное чтение, вы читаете объекты прокси-класса, но храните объекты исходного класса:
std::vector<MyClass>((std::istream_iterator<LineReader>(some_stream)),
std::istream_iterator<LineReader>());
Но, когда / если вы хотите прочитать поток объектов вместо строк объектов, вы напрямую используете собственный operator>>
объекта:
std::vector<MyClass>((std::istream_iterator<MyClass>(stream),
std::istream_iterator<MyClass>());