Я хотел бы показывать потоки в моем коде как их стандартные эквиваленты, чтобы исключить зависимость пользователя от boost::iostreams
. Хотелось бы сделать это эффективно, конечно, не создавая при необходимости копию. Я подумал о том, чтобы установить буфер std::istream
в тот, который используется boost::iostream::stream<boost::iostreams::source>
, однако это может привести к проблемам с владельцем. Как вы преобразовываете boost::iostream
в std::iostream
эквивалент? В частности, boost::iostream::stream<boost::iostreams::source>
- std::istream
.convert boost :: iostream :: stream <boost :: iostreams :: source> to std :: istream
1
A
ответ
2
Никакого преобразования не требуется:
#include <iostream>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/array.hpp>
namespace io = boost::iostreams;
void foo(std::istream& is) {
std::string line;
while (getline(is, line)) {
std::cout << " * '" << line << "'\n";
}
}
int main() {
char buf[] = "hello world\nbye world";
io::array_source source(buf, strlen(buf));
io::stream<io::array_source> is(source);
foo(is);
}
Кроме того, я не думаю, что вы могли бы иметь проблемы собственности, поскольку std::istream
не берет на себя право собственности при присвоении нового rdbuf:
Таким образом, вы также можете свободно делать:
std::istream wrap(is.rdbuf());
foo(wrap);
Печать же