ただ今C++を勉強中です.
関数を作成する際,引数を以下の様にして出力先を切り替えるようにしています.
void Function(ostream &out) {
out << "文章";
}
引数を変えることで,標準出力やファイル出力を選択出来て重宝しています.
でも,最近はある条件の時はどこにも出力させないという処理は出来ないかと考えております.
例えば,
条件がAの時はcout,
条件がBの時はfout,
条件がCの時は出力させない
と言ったようにです.
何か良い方法はあるでしょうか?
引数にostreamを入れた様々な関数を多用しているため,
お手軽にできたら幸いです.
お願い致します.
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
早速のご回答ありがとうございます.
ostreamの拡張は大変興味深いですね.
書き方としては参考URLを参照しても,
難易度が高く理解するのは難しそうですが,
採用させていただきました.
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);
早速のご回答ありがとうございます.
null_streamってやっぱりあったんですね.
自分が探していた時は見つけることができませんでした.
ただ,dbg.hxx が自分の環境には無く,
勝手に導入するわけにもいかないため,
今回はhitomuraさんの方法を採用いたしました.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Excel(エクセル) Excel 関数 vlookupなどの使い方について質問です。 シート1に品番、商品名、単価、発注条 6 2022/06/15 19:16
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
InvokeMemberメソッドとは何を...
-
if文でゼロとNULLを除外するた...
-
C言語 dequeue
-
10進数からN進数に変換するプロ...
-
Enterキーを押されたら次の処理...
-
2÷3などの余りについて
-
Cで3乗根を求める方法
-
プログラミング初心者です。 Py...
-
c言語
-
信頼区間の1.96や1.65ってどこ...
-
ある商品のロス率を5%見込み、...
-
C言語、単語ごとに改行したい
-
構文エラー";"が型の前にあり...
-
c言語で、繰り返し文の中で、0....
-
「Aに対するBの割合」と「Aに対...
-
C言語での引数の省略方法
-
visualstudio C# テキストボッ...
-
反転した数値を表示させるやり方
-
C言語を実行すると-infが出てき...
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体のリスト削除
-
InvokeMemberメソッドとは何を...
-
ばばぬきプログラムについて
-
C言語 dequeue
-
C言語 リスト
-
C# ref引数のnull判定
-
C言語
-
双方向リストのバブルソートに...
-
API 録音 MCI
-
ご教授ください。Segmentation ...
-
今度はdoubly linked listの問...
-
連結リストをソート
-
リスト構造
-
コールバック関数はnullになら...
-
C♯ 2段構造のcontextMenuStrip?
-
「Nz」は何て読むのでしょうか?
-
C言語 二分木探索
-
バブルソートを使って文字列を...
-
【C++】ストリームオブジェクト...
-
別formの多重起動防止
おすすめ情報