使用boost :: iostreams :: tee_device?

时间:2009-03-22 02:48:27

标签: c++ stream iostream boost-iostreams

有人可以帮助我吗?

我正在尝试执行以下操作:

#include <boost/iostreams/tee.hpp>
#include <boost/iostreams/stream.hpp>
#include <sstream>  
#include <cassert>  

namespace io = boost::iostreams;
typedef io::stream<io::tee_device<std::stringstream, std::stringstream> > Tee;
std::stringstream ss1, ss2;
Tee my_split(ss1, ss2); // redirects to both streams
my_split << "Testing";
assert(ss1.str() == "Testing" && ss1.str() == ss2.str());

但它不会在VC9中编译:

c:\lib\boost_current_version\boost\iostreams\stream.hpp(131) : error C2665: 'boost::iostreams::tee_device<Sink1,Sink2>::tee_device' : none of the 2 overloads could convert all the argument types

有没有人让这个工作?我知道我可以自己上课去做,但我想知道我做错了什么。

由于

2 个答案:

答案 0 :(得分:10)

您使用io::stream io::streamtee_device构建一个tee-stream本身并将所有参数转发给它。在向函数转发参数时,C ++ 03只具有有限的功能(所需的过载量很容易成指数增长)。它(io::stream)有以下限制:

  

这些成员中的每一个构造流的实例并将其与从给定参数列表构造的Device T的实例相关联。 所涉及的T构造函数必须通过值或const引用获取所有参数。

好吧,但是T构造函数说

  

根据给定的Sink对构造一个tee_device实例。如果相应的模板参数是流或流缓冲区类型,则每个函数参数都是非const引用,否则是const引用。

当然,那不行。 boost::iostreams提供了另一个构造函数,它将namespace io = boost::iostreams; typedef io::tee_device<std::stringstream, std::stringstream> TeeDevice; typedef io::stream< TeeDevice > TeeStream; std::stringstream ss1, ss2; TeeDevice my_tee(ss1, ss2); TeeStream my_split(my_tee); my_split << "Testing"; assert(ss1.str() == "Testing" && ss1.str() == ss2.str()); 作为第一个参数。这可以在这里工作(至少编译。虽然断言失败了。我没有使用flush()所以我无法帮助解决这个问题。)

<< std::flush

编辑:调用{{1}}或流{{1}}后,断言通过。

答案 1 :(得分:2)

可能你需要像这样设置:

typedef io::tee_device<std::stringstream, std::stringstream> Tee;
typedef io::stream<Tee> TeeStream;

std::stringstream ss1, ss2;
Tee my_tee(ss1, ss2);
TeeStream my_split(my_tee);