テキストを一時オブジェクトとして出力しようとしている特殊なタイプの ostringstream がありますが、問題が発生しています。明確にするために、これは本質的に私がやりたいことです:
ostringstream() << "PARTY DOWN!" << endl;
「しかし、ザック、そのコードはまったく役に立たない! オブジェクトは行の最後で破棄されます。オブジェクトが何かをしたかどうかをどうやって知ることができますか?」と言う前に、私の話を聞いてください。私は単純な ostringstreams でこれを行おうとはしませんが、デストラクタが実際にデータがオブジェクトを終了するためのパスを提供する派生クラスを使用します。したがって、実際には、次のようになります。
specialstringstream() << "PARTY DOWN!" << endl;
specialstringstream には、テキストを別の場所にダンプするデストラクタがあります。
なぜこれを行うのかについては、あまり詳しく説明しません。私がしなければならないことには意味があり、既存の巨大なコードベースにうまく適合することを信じてください。
ここに問題があります。これを行うと、すべてがコンパイルおよび実行されますが、「PARTY DOWN!」の代わりにポインター アドレスが出力に出力されます。ストリング。ストリーム出力を実行するためにコンパイラによって選択された演算子が
ostream& operator<< (const void* val)
, not であるため、これが発生していると判断しましたostream& operator<< (ostream& out, const char* s )
。
理由はなんとなくわかりますが、どうすればいいのか途方に暮れています。char*s を stringstream の一時的なインスタンスに出力するにはどうすればよいですか?
動作を示す SpecialStringStream オブジェクトの短いバージョンを次に示します。
class SpecialStringStream : public ostringstream
{
public:
SpecialStringStream(ostream* regularStream)
{
regularStream_ = regularStream;
}
~SpecialStringStream()
{
if (regularStream_ != NULL)
(*regularStream_) << str();
}
private:
ostream* regularStream_;
};
次のようなことSpecialStringStream(someStreamPtr) << "PARTY DOWN!" << endl;
をすると、メッセージの代わりに出力に「00444D60」のようなポインターアドレスが表示されます。
編集:私は自分の質問に答えるにはあまりにも新しいユーザーなので、すべての回答のおかげでここに落ち着きました。
私は、次のソリューションを思いつきました。これは、Visual C++ 8 と、必要な他のすべてのコンパイラで動作します。基本的に、const SpecialStringStream の constness を取り除き、それを ostream としてキャストし、ostream オペレーターに自分の仕事をさせるテンプレート オペレーターを作成しました。コメントでそれを細断して、私が導入したすべての恐ろしい潜在的なバグについて警告してください!
template <class T>
std::ostream& operator<<(const SpecialStringStream &o, T msg)
{
return static_cast<std::ostream&>(const_cast<SpecialStringStream&>(o)) << msg;
}