Domanda

Qualcuno mi può aiutare?

che sto cercando di fare qualcosa di simile al seguente:

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

Ma non si compila in 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

Qualcuno ha ottenuto questo lavoro? So che potrei fare la mia classe per farlo, ma voglio sapere che cosa sto facendo male.

Grazie

È stato utile?

Soluzione

Si utilizza la costruttore-forwarding versione di io::stream, che costruire un T-stream stesso e trasmettere tutti gli argomenti a questo. C ++ 03 è limitata solo capacità quando si tratta di spedizioni argomenti alle funzioni (quantità di sovraccarichi necessari facilmente crescere in modo esponenziale). Si (tee_device) rende le seguenti limitazioni:

  

Ciascuno di questi membri costruisce un'istanza di flusso e l'associa un'istanza del dispositivo T costruito dalle liste date di argomenti. I costruttori T coinvolti deve prendere tutti gli argomenti per valore o riferimento const.

Bene, ma il costruttore T dice

  

Costruisce un'istanza di tee_device basato sulla coppia data di dispersori. Ogni parametro di funzione è un riferimento non const se l'argomento modello corrispondente è un tipo di flusso o flusso tampone, e un riferimento const altrimenti.

Non funzionerà, ovviamente. boost::iostreams fornisce un altro costruttore che prende un flush() come primo parametro. Questo funziona qui (compila, per lo meno. L'asserzione non riesce, però. Non ho lavorato con << std::flush quindi non posso fare questa operazione)

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: Dopo aver chiamato <=> o lo streaming <=>, l'affermazione passa.

Altri suggerimenti

Probabilmente è necessario configurarlo in questo modo:

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top