0

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::coutstd::cin、またはその他のとの間でストリーミングしたいクラスのストリーム演算子を記述する方法は知っていますが、インスタンスがインスタンスではなく lhs として機能std::iostreamするストリーム演算子を記述するのに苦労しています。c_Outputstd::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簡単です。

4

2 に答える 2

0
operator<< (c_Output& x_output, std::ostream& x_stream)

唯一の本当の問題は、それがでstd::hexはないことstd::ostreamであり、あなたのメソッドではオーバーロード<<されていません。

hex修飾子の使用をサポートするには、friendパラメーターを含む別のオーバーロードが必要です(c_Output&, ios_base& (*)(ios_base&))(hex参照をios_base返すios_base関数へのポインターと同様に)。

進行中のレートでは、他のすべての<<オーバーロードも実装する必要があります。std::ostreamこれは簡単な作業ではありませんが、継承の有無にかかわらず、として偽装する必要があります。

于 2013-05-03T04:02:22.620 に答える
0

std::hexの型は ですstd::ios_base& (*)(std::ios_base&)。オペレーターの署名を次のように変更します。

c_Output& operator<< (c_Output& x_output, std::ios_base& (*x_stream)(std::ios_base&));
于 2013-05-03T03:40:44.090 に答える