Usando boost :: iostreams :: tee_device?
-
21-08-2019 - |
Pergunta
alguém pode me ajudar?
Eu estou tentando fazer algo como o seguinte:
#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());
Mas isso não vai compilar no 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
Alguém chegado a este trabalho? Eu sei que eu poderia fazer minha própria classe para fazer isso, mas eu quero saber o que estou fazendo de errado.
Graças
Solução
Você usa o construtor de encaminhamento versão de io::stream
, que constroem um tee-transmitir-se e encaminhar todos os argumentos para isso. C ++ 03 tem capacidades limitadas apenas quando se trata de encaminhamento argumentos para funções (quantidade de sobrecargas necessários facilmente crescer exponencialmente). Ele (io::stream
) faz as seguintes restrições:
Cada um destes membros constrói uma instância de fluxo e associa-o uma instância do dispositivo T construída a partir das listas de dados de argumentos. Os construtores T envolvidas devem tomar todos os argumentos por referência de valor ou const.
Bem, mas o construtor tee_device
diz
Constrói um exemplo de tee_device com base no par dado de pias. Cada parâmetro de função é uma referência não-const se o argumento de modelo correspondente é um tipo de fluxo ou fluxo de tampão, e um const referência em contrário.
Isso não vai funcionar, é claro. io::stream
fornece outro construtor que leva um T
como primeiro argumento. Isso funciona aqui (compila, pelo menos. A afirmação falhar, apesar de tudo. Eu não tenho trabalhado com boost::iostreams
então eu não posso ajudar com isso)
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: Depois de chamar flush()
ou streaming de << std::flush
, a afirmação passa.
Outras dicas
Provavelmente você precisará configurá-lo como este:
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);