7

誰かが私を助けることができますか?

私は次のようなことをしようとしています:

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

ただし、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

誰かがこれを機能させましたか?私はそれを行うために自分のクラスを作ることができることを知っていますが、私は自分が間違っていることを知りたいです。

ありがとう

4

2 に答える 2

12

のコンストラクタ転送バージョンを使用しますio::stream。これは、tee ストリーム自体を構築し、すべての引数をそれに転送します。関数への引数の転送に関しては、C++03 の機能は限られています (必要なオーバーロードの量は簡単に指数関数的に増加します)。それ ( io::stream) は、次の制限を行います。

これらの各メンバーは、ストリームのインスタンスを構築し、指定された引数のリストから構築されたデバイス T のインスタンスに関連付けます。関連する T コンストラクターは、すべての引数を値または const 参照で受け取る必要があります。

まあ、しかしtee_deviceコンストラクターは言う

指定されたシンクのペアに基づいて、tee_device のインスタンスを構築します。各関数パラメーターは、対応するテンプレート引数がストリームまたはストリーム バッファー型である場合は非 const 参照であり、それ以外の場合は const 参照です。

もちろん、それはうまくいきません。最初の引数としてio::streamを受け取る別のコンストラクターを提供します。Tこれはここで機能します(少なくともコンパイルします。ただし、アサーションは失敗します。私は働いていないboost::iostreamsので、私はそれを手伝うことはできません)

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

編集: の呼び出しflush()またはストリーミングの後<< std::flush、アサーションが渡されます。

于 2009-03-22T03:29:41.937 に答える
2

おそらく、次のように設定する必要があります。

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);
于 2009-03-22T03:02:33.203 に答える