ホームページ > バックエンド開発 > C++ > ` をオーバーロードするときに `std::endl` を処理する方法

` をオーバーロードするときに `std::endl` を処理する方法

Susan Sarandon
リリース: 2024-12-07 04:25:21
オリジナル
331 人が閲覧しました

How to Handle `std::endl` When Overloading the `

演算子のオーバーロード<<カスタム endl 処理を使用する

演算子をオーバーロードする場合<<演算子を使用すると、std::endl を使用しようとするとコンパイル エラーが発生する可能性があります。このエラーは、コンパイラが適切な演算子<<を見つけられないために発生します。

これを解決するには、std::endl がオブジェクトではなく関数であることを理解する必要があります。これに対応するために、std::cout には独自の演算子<<があります。 std::endl と同じシグネチャを持つ関数ポインターを特に受け取るオーバーロード。呼び出されると、このオーバーロードは関数を呼び出し、戻り値を伝播します。

カスタム ストリームが std::endl を処理できるようにするには、同様のアプローチが必要です。これを示すコード例を次に示します。

#include 

struct MyStream {
    template 
    MyStream& operator<<(const T& x) {
        std::cout << x;
        return *this;
    }

    // Function that takes a custom stream and returns it
    typedef MyStream& (*MyStreamManipulator)(MyStream&);

    // Overload to accept functions with custom signature
    MyStream& operator<<(MyStreamManipulator manip) {
        return manip(*this);
    }

    // Custom `endl` implementation for this stream
    static MyStream& endl(MyStream& stream) {
        std::cout << std::endl;
        stream << "Called MyStream::endl!" << std::endl;
        return stream;
    }

    // Type of std::cout
    typedef std::basic_ostream> CoutType;

    // Function signature of std::endl
    typedef CoutType& (*StandardEndLine)(CoutType&);

    // Overload to accept std::endl
    MyStream& operator<<(StandardEndLine manip) {
        manip(std::cout);
        return *this;
    }
};

int main() {
    MyStream stream;

    stream << 10 << " faces." << MyStream::endl << std::endl;

    return 0;
}

このコードには、次のものがあります。

  • オーバーロードされた演算子<< MyStream がカスタム シグネチャを持つジェネリック型と関数を処理できるようにします。
  • 新しい行と追加情報を出力するカスタム endl 関数を定義しました。
  • オーバーロードされた演算子<< MyStream が std::endl の関数ポインタを引数として受け入れるようにします。

このアプローチにより、例の MyStream のようなカスタム ストリームが std::endl をサポートし、使用時にカスタム動作を提供できるようになります。

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

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