将boost :: iostream :: stream <boost :: iostreams :: source>转换为std :: istream

时间:2017-02-14 02:12:36

标签: c++ boost iostream boost-iostreams

我想在我的代码中公开流作为标准等价物,以消除用户对boost::iostreams的依赖。 如果有必要,当然无需创建副本就可以有效地执行此操作。我想过将std::istream的缓冲区设置为boost::iostream::stream<boost::iostreams::source>使用的缓冲区,但这可能会导致所有权问题。 如何将boost::iostream转换为std::iostream等效? 特别是boost::iostream::stream<boost::iostreams::source>std::istream

1 个答案:

答案 0 :(得分: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);

打印相同的