ブースト::入出力ストリームを使用して:: tee_deviceを?
-
21-08-2019 - |
質問
誰かが私を助けることはできますか?
私は次のような何かをしようとしています:
#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
誰もが、これは動作するように得ていますか?私はそれを行うには自分自身のクラスを作ることができます知っているが、私は私が間違っているのかを知りたい。
おかげ
解決
あなたはコンストラクタ転送を使用しますティー・ストリーム自体を構築し、それにすべての引数を転送io::stream
のバージョンを、。それは機能(簡単に指数関数的に成長に必要な過負荷の量)に引数を転送するために来るとき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
を呼び出した後、アサーションを渡します。
他のヒント
おそらく、あなたはこのようにそれを設定する必要があります:
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);