Примечание. Отредактировано на основе ответов для получения более подходящих ответов.
У меня есть коллекция шаблонов C ++, которые я делал на протяжении многих лет и называю Joop. Он состоит в основном из библиотек, которые не совсем попадают в категорию «общего назначения», но достаточно полезны, так что я продолжаю добавлять их в разные проекты, поэтому большинство из них не имеют эквивалентов в других библиотеках, таких как Boost. *
Один из этих классов seqstream
. Идея состоит в том, что он позволяет вам обрабатывать любую итеративную последовательность как обычный STL-подобный поток, чей «тип символа» является типом значения последовательности.
Обоснование этого класса двоякое. Во-первых, он должен представлять интерфейс, который делает любую потенциально нелинейную, несмежную последовательность выглядеть линейной и смежной; и во-вторых, он должен обрабатывать любой объект в потоке, как если бы он был одним сложным крупным символом. Существует стандартное средство обработки потока как последовательности, так почему бы не наоборот?
В настоящее время seqstream
включает три итератора для первого, последнего и текущего элемента. Я хочу заменить seqstream
на basic_seqbuf
, который можно подключить к стандартному потоку. Может ли кто-нибудь предоставить ресурсы, чтобы я начал расширять std::basic_streambuf
, чтобы обеспечить такое поведение?
Кроме того, если разрешена запись seqbuf
, то при записи объекта в seqbuf
не сериализуется объект, но выполняется соответствующий вызов метода insert()
или использует указанный пользователем итератор вставки, например std::back_insert_iterator
.
Edit:
Вот пример того, как seqstream
используется в настоящее время:
// Create a sequence of objects.
std::vector<std::string> sequence;
for (int i = 0; i < 10; ++i) {
std::ostringstream stream;
stream << "Element " << i << ".";
sequence.push_back(stream.str());
}
// Create a seqstream wrapping that sequence.
joop::seqstream< std::vector<std::string> > seqstream(sequence.begin(), sequence.end());
// Read the sequence like a stream.
std::string element;
while (seqstream >> element) // OR seqstream.get(element)
std::cout << element << '\n';