У меня есть две функции, давайте их назовем producer(std::ostream& output)
а также consumer(std::istream& input)
и мне нужно связать вывод производителя с потребителем. Прямо сейчас я делаю это так:
std::stringstream temp;
producer(temp);
consumer(temp);
Это имеет два с половиной очевидных недостатка. Во-первых, меньшая проблема для меня — использование памяти. Производитель генерирует около 20 МБ данных, и все это должно быть сохранено. Большая проблема — скорость. Потребителю часто нужно прочитать только несколько байтов из входного потока, но производитель должен сгенерировать все. Также это не будет работать на потенциально бесконечных потоках, сгенерированных производителем.
Есть ли какой-нибудь магический адаптер, который я мог бы использовать вместо stringstream
это только буферизует минимально необходимое количество данных и затем переключается между производителем и потребителем?
У меня была идея (очень не конкретная :-)), что такого рода сопрограммы, вероятно, можно как-то сделать с setjmp
а также longjmp
, но я никогда не работал с этими функциями, и у меня есть ощущение, что с этим возникнут некоторые проблемы.
Я задаю этот вопрос только из любопытства и потому, что мне нравятся простые решения. Я знаю, что могу решить эту проблему путем преобразования производителя из функции непосредственно в istream.
Изменить: поведение моего гипотетического адаптера примерно так:
Здесь не должно быть необходимости в потоках.
Задача ещё не решена.
Других решений пока нет …