Pregunta

Puede alguien ayudarme?

Estoy tratando de hacer algo como lo siguiente:

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

Pero no se compilará en 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

¿Alguien ha conseguido que esto funcione? Sé que podría hacer mi propia clase para hacerlo, pero yo quiero saber lo que estoy haciendo mal.

Gracias

¿Fue útil?

Solución

Se utiliza el constructor de reenvío versión de io::stream, que la construcción de un tee-corriente de sí mismo y transmita todos los argumentos a eso. C ++ 03 tiene capacidades limitadas solamente cuando se trata de reenvío de argumentos a las funciones (cantidad de sobrecargas necesarios crecer fácilmente de forma exponencial). Es (tee_device) hace las siguientes restricciones:

  

Cada uno de estos miembros construye una instancia de la corriente y lo asocia con una instancia de la Device T construido a partir de las listas dadas de argumentos. Los constructores T implicadas deben tener todos los argumentos por valor o referencia constante.

Bueno, pero el constructor T dice

  

construye una instancia de tee_device basado en el par de Sinks dado. Cada parámetro de la función es una referencia no const si el argumento de plantilla correspondiente es un tipo de flujo o corriente de tampón, y una referencia const lo contrario.

Eso no funcionará, por supuesto. boost::iostreams proporciona otro constructor que toma un flush() como primer argumento. Esto funciona aquí (compila, por lo menos. La afirmación falla, sin embargo. No he trabajado con << std::flush así que no puedo ayudar con eso)

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

Editar: Después de llamar <=> o streaming <=>, la afirmación pasa.

Otros consejos

Es probable que necesita para su instalación como esta:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top