• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【C++】ストリームオブジェクトを切り替える方法に)

【C++】ストリームオブジェクトの切り替え方法は?

このQ&Aのポイント
  • C++の勉強中にストリームオブジェクトの切り替え方法について調べています。
  • 関数を作成する際、引数を変えることで標準出力やファイル出力を選択することができます。
  • しかし、特定の条件の時に出力を制御する方法について教えてほしいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.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の拡張ができるのか。回答している自分も勉強になりました。

参考URL:
http://www.jah.ne.jp/~naoyuki/Writings/ExtIos.html
tokkotokon
質問者

お礼

早速のご回答ありがとうございます. ostreamの拡張は大変興味深いですね. 書き方としては参考URLを参照しても, 難易度が高く理解するのは難しそうですが, 採用させていただきました.

その他の回答 (1)

回答No.1

「なにもしないストリーム」をostreamから導出してはいかがでしょう。 あるいは void Function(ostream &out) {   if ( &out == nullptr ) return; // なにもしない   out << "文章"; } ostream* null_stream_ptr = nullptr; ostream& null_stream = *null_stream_ptr; Function(null_stream);

tokkotokon
質問者

お礼

早速のご回答ありがとうございます. null_streamってやっぱりあったんですね. 自分が探していた時は見つけることができませんでした. ただ,dbg.hxx が自分の環境には無く, 勝手に導入するわけにもいかないため, 今回はhitomuraさんの方法を採用いたしました.