Napisałem klasę, która działa jak iterator, aby parsować pliki w formacie CSV. Napisałem również inne klasy, aby odczytać konkretne pliki CSV, aby wypełnić bezpośrednio strukturę MyObject. W ten sposób klasa może być używana tak (usunąłem błąd obsługi część kodu):Czy warto używać iteratorów do czytania sformatowanego strumienia?
std::ifstream in(filename);
MyObjectParser parser(in);
MyObjectParser::Iterator it;
for (it = parser.begin(); it != parser.end(); it++)
{
MyObject b = *it;
// do some stuff here ...
}
program działa dobrze i jestem z niego zadowolony, ale uświadomiłem sobie, że niejawny znaczenia (tylko dla siebie?) iteratora jest to, że będzie iterować nad kolekcją. W tym przypadku nie ma kolekcji, ale strumień.
Wolałbym formularz, który wyraźnie sugerują używam strumień przeciążenia >> operatora a więc mający coś takiego:
std::ifstream in(filename);
MyObjectReader reader(in);
MyObject obj;
while(reader >> obj)
{
// do the same "some stuff" here...
}
To tylko kwestia gustu? Nie widzę jasno, jakie są różnice (z wyjątkiem tego, że w drugiej formie obiekt jest po prostu wypełniony, a nie skopiowany) i jakie są konsekwencje wyboru pierwszej lub drugiej formy.
Chciałbym uzyskać inne opinie, aby dokładnie wiedzieć, dlaczego używam rozwiązania, a nie innego.
Kto mówi, że iteratory powinny iterować po * kolekcjach *? Rozumiem, że iteratory iterują nad * czymś *, * czym * jest ** dowolnym rodzajem danych **, na przykład kontenerem, strumieniem (plik, dane sieciowe, ...) lub nawet niejawnym (może sztucznym) dane. Zachowaj to ogólne. ;) Osobiście lubię twój interfejs oparty na iteratorze. – leemes