- ベストアンサー
【C++】ストリームオブジェクトの切り替え方法は?
- C++の勉強中にストリームオブジェクトの切り替え方法について調べています。
- 関数を作成する際、引数を変えることで標準出力やファイル出力を選択することができます。
- しかし、特定の条件の時に出力を制御する方法について教えてほしいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
それっぽいことをやっているページを発見した(参考URL)ので、それを基に以下に書いてみます。 (インデントは全角スペースで行っています。) #include <iostream> template <class Ch,class Tr=std::char_traits<Ch> > class basic_null_streambuf : public std::basic_streambuf<Ch,Tr> { public: basic_null_streambuf(void) { setbuf(0,0); } ~basic_null_streambuf(void) { } protected: std::streampos seekoff( std::streamoff off, std::ios::seek_dir dir, int nMode = std::ios::in | std::ios::out ) { return EOF; } std::streampos seekpos( std::streampos pos, int nMode = std::ios::in | std::ios::out ) { return EOF; } int overflow( int nCh = EOF ) { return 0; } int underflow(void) { return EOF; } }; template <class Ch,class Tr=std::char_traits<Ch> > class basic_null_stream : public std::basic_iostream<Ch,Tr> { public: basic_null_stream(void) : std::basic_iostream<Ch,Tr>(new basic_null_streambuf<Ch,Tr>()) { } ~basic_null_stream(void) { } }; typedef basic_null_streambuf<char> null_streambuf; typedef basic_null_stream<char> null_stream; void output(std::ostream& out) { out << "hello!" << std::endl; } int main(int argc, char** argv) { output(std::cout); null_stream nil; output(nil); return 0; } Visual C++ 2008 で動作確認済です。 # こうすればiostreamの拡張ができるのか。回答している自分も勉強になりました。
その他の回答 (1)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
「なにもしないストリーム」をostreamから導出してはいかがでしょう。 あるいは void Function(ostream &out) { if ( &out == nullptr ) return; // なにもしない out << "文章"; } ostream* null_stream_ptr = nullptr; ostream& null_stream = *null_stream_ptr; Function(null_stream);
お礼
早速のご回答ありがとうございます. null_streamってやっぱりあったんですね. 自分が探していた時は見つけることができませんでした. ただ,dbg.hxx が自分の環境には無く, 勝手に導入するわけにもいかないため, 今回はhitomuraさんの方法を採用いたしました.
お礼
早速のご回答ありがとうございます. ostreamの拡張は大変興味深いですね. 書き方としては参考URLを参照しても, 難易度が高く理解するのは難しそうですが, 採用させていただきました.