2017-02-14 6 views
1

Я хотел бы показывать потоки в моем коде как их стандартные эквиваленты, чтобы исключить зависимость пользователя от 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

ответ

2

Никакого преобразования не требуется:

Live On Coliru

#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:

Таким образом, вы также можете свободно делать:

Live On Coliru

std::istream wrap(is.rdbuf()); 
foo(wrap); 

Печать же

Смежные вопросы