Я учусь C++, проработав много с Haskell и функциональными языками в целом, и я обнаружил, что я постоянно пытаюсь решить ту же проблему:Как написать настраиваемое преобразование потока в C++?
- прочитать некоторые данные из входного потока
- разметить их на основе определенного алгоритма
- процесса лексемы
Если бы это был Haskell, я мог бы просто воспользоваться тем, что все это лень, и написать свою трансформацию, как я думаю об этом, а затем это будет g et, который используется в качестве нисходящего потока. Существуют даже библиотеки, которые делают этот точный шаблон (conduit и pipes).
Предположим, что я хотел взять последовательность 1 2 3 4 5 6 ...
и вывести 12 34 56 ...
. Я могу видеть, как написать специальный код, который работает с потоком и обрабатывает данные. Но я хотел бы знать , если есть механизм абстракции, который позволяет мне создавать новый поток, преобразовывая данные (каким-либо мыслимым способом) из другого потока. Эта абстракция должна позволять мне буферизовать данные по мере обработки, а не просто сопоставление одного элемента с новым значением.
Вот ограничения:
- Я не могу использовать любую другую библиотеку, кроме STDLIB.
- Он должен работать на C++ 03 (имеется в виду не C++ 11 функций.)
Если вы думаете, это домашнее задание? Хорошо, я получаю много назначений классов, которые требуют от меня работать с потоками данных (что является причиной отсутствия библиотеки и ограничений C++ 03). Дело не в том, что я не знаю, как это сделать, используя петли while
, но я хотел бы знать, существует ли существующая потоковая абстракция в stl, просто ожидая ее обнаружения и использования.
Но если единственный способ сделать это - использовать C++ 11, то я хотел бы знать.
Нет готового пакета, о котором я знаю. Возможно, пользовательский тип класса, используемый с 'std :: istream_iterator'? –
@ T.C. хм, это может быть то, что я ищу. Если я правильно понимаю, я бы использовал пользовательский итератор, который принимает входной поток и который производит нужный мне результат? Что делать, если я хотел взять один итератор и построить из него еще один итератор (думаю, композиция)? –
Я думал о классе с пользовательским оператором извлечения потока, который использовался с ['std :: istream_iterator'] (http://en.cppreference.com/w/cpp/iterator/istream_iterator). Что касается композиции, вам нужно будет написать свои собственные адаптеры итераторов. –