std::ostream
異なる目的を果たす2 つのメンバーを持つカスタム出力クラスがあります。出力クラスの構成方法に応じて、いずれかのストリームが使用されます。場合によっては、2 つのストリームがチェーン化されます。クラスの大幅に簡略化されたバージョンを以下に示します。必要に応じて、さらに詳細を提供できます。
class c_Output
{
public:
c_Output (bool x_useA) : m_useA(x_useA) { /* setup m_stream[AB] here */ };
~c_Output ();
inline std::ostream& stream () { return (m_useA ? m_streamA : m_streamB); };
private:
bool m_useA;
std::ostream m_streamA;
std::ostream m_streamB;
}
std::cout
、 std::cin
、またはその他のとの間でストリーミングしたいクラスのストリーム演算子を記述する方法は知っていますが、インスタンスがインスタンスではなく lhs として機能std::iostream
するストリーム演算子を記述するのに苦労しています。c_Output
std::ostream
今、私は逃げることができます:
c_Output l_output;
uint64_t l_value = 0xc001c0de;
l_output.stream() << std::hex << std::setw(16) << std::setfill('0') << l_value;
c_Output::stream()
適切な を返すstd::ostream&
ため、これは期待どおりに動作します。
上記を次のように書き換えたいと思います。
c_Output l_output;
uint64_t l_value = 0xc001c0de;
l_output << std::hex << std::setw(16) << std::setfill('0') << l_value;
operator<<
ここで StackOverflow とより大きな Web で見た例に基づいて、いくつかの異なるバージョンの定義を試みましたが、役に立ちませんでした。最新バージョンは次のようになります。
// in header
class c_Output
{
...
friend c_Output& operator<< (c_Output& x_output, std::ostream& x_stream);
...
}
// in source
c_Output&
operator<< (c_Output& x_output, std::ostream& x_stream)
{
x_output.stream() << x_stream;
return x_output;
}
引数の設定は、標準のストリーム演算子のオーバーロードを反映することを目的としています。この設定により、次のようなコンパイルの問題が発生します。
error: no match for 'operator<<' in 'l_output << std::hex'
note: candidates are: c_Output& operator<<(c_Output&, std::ostream&)
すべてのファイルと行の情報を削除しましたが、要点はわかります。明らかに、演算子の rhs の型が正しくありません。必要に応じてストリーム演算子を実装する正しいタイプおよび/または正しい手段は何ですか?
同様の要件を持つ補完的なc_Input
クラスもありますが、答えを適応させるのはc_Output
簡単です。