コンソールへの出力で使用する色のストリーム マニピュレータを作成しようとしています。テキストと背景の色を変更して機能します。
std::cout << ConColor::Color::FgBlue << 123 << "abc"; //text is blue, sticky
問題は署名にあります:
std::ostream &FgBlue(std::ostream &);
このシグネチャは、派生クラスなども許可しますstd::ostringstream
が、文字列ストリームの色を変更する方法はありません。この関数は、そのような引数で呼び出されたかどうかに関係なく、コンソールの色を変更します。
std::cout
したがって、引数が、などの行に沿ったものであることを確認したいと思います。将来の標準でさらにオブジェクトが追加されるstd::wcout
場合に備えて、一般的なものにしたいと思います。std::ostream
std::is_same
andを含む多くのことを試しましstd::is_base_of
たが、前者が機能しない場合、から継承する引数の型std::basic_ostream<>
は関数に渡されたときに比較している型にキャストされ、誤検知を与えるため、最終的には無意味であることに気付きました。
これにより、最終的に以下の回答にたどり着きました (可変個のテンプレートのテンプレート引数? うわー、それは一口です!) ただし、いくつかの問題があります。
- コンパイラは可変個引数テンプレートをサポートする必要があります。MSVCでのソリューション作業を希望します。
std::ostringstream
コンパイラは、異なる数のテンプレート引数 ( 2 ではなく 3 を持つ など) を持つ派生クラスが使用される場合、関数シグネチャを通過しないため、不可解なエラーを出します。- たとえば、stdout をファイルにリダイレクトすることは可能です。そのため、引数が
std::cout
であっても、stringstream の場合と同じことが起こります。
他のソリューションを投稿することをお勧めします。できれば私のものよりも優れていることを願っています。少なくとも VS11 で動作するものを投稿してください。