Frage

Kann mir jemand helfen?

Ich versuche, so etwas wie die folgenden Funktionen ausführen:

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

Aber es wird in VC9 nicht kompiliert werden:

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

Hat jemand bekommen dies funktioniert? Ich weiß, ich könnte meine eigene Klasse machen, es zu tun, aber ich möchte wissen, was ich falsch mache.

Danke

War es hilfreich?

Lösung

Sie verwenden das Konstruktor-Forwarding Version von io::stream, die einem T-Stück-Strom selbst konstruieren und alle Argumente an, dass übermitteln. C ++ 03 hat Fähigkeiten nur begrenzt, wenn es darum geht, Argumente an Funktionen (Anzahl der Überlastungen exponentiell leicht wachsen erforderlich) zur Weiterleitung. Es (io::stream) macht die folgenden Einschränkungen:

  

Jedes dieser Elemente konstruiert eine Instanz von Strom und verbindet sie mit einer Instanz des Geräts T aus den gegebenen Listen von Argumenten konstruiert. Die T-Konstrukteure beteiligt sind, müssen alle Argumente von Wert oder konstante Referenz nehmen.

Nun, aber der tee_device Konstruktor sagt

  

Konstruiert eine Instanz von tee_device auf dem gegebenen Paar von Sinks basiert. Jeder Funktionsparameter ist eine nicht konstante Referenz, wenn das entsprechende Vorlage Argument ein Strom oder Strom-Puffer-Typ ist, und eine konstante Referenz anders.

Das wird nicht funktionieren, natürlich. io::stream bietet eine weitere Konstruktor, der eine T als erstes Argument annimmt. Das funktioniert hier (Compiliert zumindest. Die Behauptung nicht, though. Ich habe nicht mit boost::iostreams gearbeitet, so dass ich nicht helfen kann)

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: Nach flush() Aufruf oder Streaming << std::flush, die Behauptung geht.

Andere Tipps

Wahrscheinlich müssen Sie es einrichten zu können wie folgt:

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top