Utilizzando boost :: :: iostreams tee_device?
-
21-08-2019 - |
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
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);