演算子のオーバーロード<<カスタム endl 処理を使用する
演算子をオーバーロードする場合<<演算子を使用すると、std::endl を使用しようとするとコンパイル エラーが発生する可能性があります。このエラーは、コンパイラが適切な演算子<<を見つけられないために発生します。
これを解決するには、std::endl がオブジェクトではなく関数であることを理解する必要があります。これに対応するために、std::cout には独自の演算子<<があります。 std::endl と同じシグネチャを持つ関数ポインターを特に受け取るオーバーロード。呼び出されると、このオーバーロードは関数を呼び出し、戻り値を伝播します。
カスタム ストリームが std::endl を処理できるようにするには、同様のアプローチが必要です。これを示すコード例を次に示します。
#includestruct 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 サイトの他の関連記事を参照してください。