アプリ版:「スタンプのみでお礼する」機能のリリースについて

ただ今C++を勉強中です.
関数を作成する際,引数を以下の様にして出力先を切り替えるようにしています.

void Function(ostream &out) {
   out << "文章";
}

引数を変えることで,標準出力やファイル出力を選択出来て重宝しています.

でも,最近はある条件の時はどこにも出力させないという処理は出来ないかと考えております.
例えば,
条件がAの時はcout,
条件がBの時はfout,
条件がCの時は出力させない
と言ったようにです.

何か良い方法はあるでしょうか?
引数にostreamを入れた様々な関数を多用しているため,
お手軽にできたら幸いです.

お願い致します.

A 回答 (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
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます.

ostreamの拡張は大変興味深いですね.

書き方としては参考URLを参照しても,
難易度が高く理解するのは難しそうですが,
採用させていただきました.

お礼日時:2011/12/01 18:15

「なにもしないストリーム」をostreamから導出してはいかがでしょう。



あるいは

void Function(ostream &out) {
  if ( &out == nullptr ) return; // なにもしない
  out << "文章";
}

ostream* null_stream_ptr = nullptr;
ostream& null_stream = *null_stream_ptr;
Function(null_stream);
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます.

null_streamってやっぱりあったんですね.
自分が探していた時は見つけることができませんでした.

ただ,dbg.hxx が自分の環境には無く,
勝手に導入するわけにもいかないため,
今回はhitomuraさんの方法を採用いたしました.

お礼日時:2011/12/01 16:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!