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

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top