Использование устройства boost::iostreams:: tee?

может кто-нибудь помочь мне?

Я пытаюсь сделать что-то вроде следующего:

#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:libboost_current_versionboostiostreamsstream.hpp(131) : error C2665: 'boost::iostreams::tee_device<Sink1,Sink2>::tee_device' : none of the 2 overloads could convert all the argument types

кто-нибудь получил эту работу? Я знаю, что могу сделать свой собственный класс, чтобы сделать это, но я хочу знать, что я делаю неправильно.

спасибо

2 ответов


использовать конструктор-переадресация версии of io::stream, которые строят сам tee-поток и передают все аргументы этому. C++03 имеет только ограниченные возможности, когда дело доходит до пересылки аргументов функциям (количество необходимых перегрузок легко растет экспоненциально). Это (io::stream) имеет следующие ограничения:

каждый из этих членов создает экземпляр stream и связывает его с экземпляром устройства T, построенного из данный список аргументов. задействованные конструкторы T должны принимать все аргументы по значению или ссылке const.

, но tee_device конструктор говорит

создает экземпляр tee_device на основе данной пары приемников. Каждый параметр функции является ссылкой non-const, если соответствующий аргумент шаблона является типом буфера потока или потока, а в противном случае-ссылкой const.

, что не работа, конечно. io::stream предоставляет другой конструктор, который принимает T в качестве первого аргумента. Это работает здесь (компилирует, по крайней мере. Однако это утверждение не соответствует действительности. Я не работал с 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());

Edit: после вызова flush() или потокового << std::flush утверждение проходит.


вероятно, вам нужно настроить его следующим образом:

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);