ホームページ > バックエンド開発 > C++ > カスタムストリーム演算子のオーバーロードで `std::endl` を処理する方法は?

カスタムストリーム演算子のオーバーロードで `std::endl` を処理する方法は?

DDD
リリース: 2024-12-08 08:26:12
オリジナル
238 人が閲覧しました

How to Handle `std::endl` in Custom Stream Operator Overloading?

カスタム ストリーム実装における演算子のオーバーロードと 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 を処理するように定義できます。

    このカスタム実装は演算子<<を定義します。これは 2 つの型を受け入れます:
  • 最初の型は、MyStream オブジェクトへの参照を取得し、同じオブジェクトへの参照を返す汎用関数ポインターです。
2 番目の型は特に MyStream オブジェクトへの参照を取得し、同じオブジェクトへの参照を返す関数ポインター。

これにより、カスタムの実装が可能になります。カスタム ストリームを操作する endl 関数。

以上がカスタムストリーム演算子のオーバーロードで `std::endl` を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート