1

Streamというカスタムクラスがあります

class Stream
public:
    Stream& operator<<(int i) { stream_ << i; return *this;}
            template <typename CustomClass>
            Stream& operator<<(const CustomClass& c) { stream_ << c.toString() /* assume this template always have toString(); return *this; }
private:
    std::stringstream stream_;
};

これは私が実際に持っているものの非常に基本的な例です。そして、次のように std::ios_base フラグを設定しようとしています:

Stream() << 1 << std::hex << 2;

演算子の使用;

Stream& operator<<(std::ios_base& b) { stream_.setf(b.flags()); return *this; }

std::hex は std::ios_base を返すため、これを呼び出してストリームのフラグを設定する必要があるため、私が理解していることから。ただし、常にテンプレートを呼び出します。注: このテンプレートを削除すると、すべてが期待どおりに機能しますが、両方を持つ方法はありますか?

さらに説明が必要な場合は、お気軽にお問い合わせください

4

1 に答える 1

0

IOStream マニピュレータは type のオブジェクトではなく、参照を受け取っstd::ios_baseて返す関数ですstd::ios_base。したがって、これらのオブジェクトに関してストリーム挿入を行いたい場合は、関数ポインターをオーバーロードする必要があります。

Stream& operator<<(std::ios_base& (*manip)(std::ios_base&))
//                 ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
{
    manip(this->stream);
    return *this;
}
于 2014-01-21T20:31:31.837 に答える