カスタム ストリーム実装における演算子のオーバーロードと std::endl の処理
次のコード スニペットを考えてみましょう。はオーバーロードされています:
template <typename T> UIStream& operator<< (const T); UIStream my_stream; my_stream << 10 << " heads";
これは期待どおりに機能しますが、my_stream << を使用しようとしています。 endl を実行すると、「バイナリ '<<'」というコンパイル エラーが発生します。 : 'UIStream' 型の左側のオペランドを取る演算子が見つかりません..."
この問題を解決するには、std::endl がオブジェクトではなく関数であることを理解することが重要です。 std::cout では、operator<< を実装することで利用されます。 std::endl と同じシグネチャを持つ関数ポインターを受け入れます。呼び出されると、関数が呼び出され、その戻り値が転送されます。
演算子のカスタム実装
struct MyStream { template <typename T> MyStream& operator<< (const T& x) { std::cout << x; return *this; } // Function that takes a custom stream and returns it typedef MyStream& (*MyStreamManipulator)(MyStream&); // Accept function with custom signature MyStream& operator<< (MyStreamManipulator manip) { return manip(*this); } // Define a custom endl for this stream (matches MyStreamManipulator signature) static MyStream& endl(MyStream& stream) { std::cout << std::endl; stream << "Called MyStream::endl!" << std::endl; return stream; } };同様の方法で std::endl を処理するように定義できます。
以上がカスタムストリーム演算子のオーバーロードで `std::endl` を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。