Rumah > pembangunan bahagian belakang > C++ > Cara Mengendalikan `std::endl` Apabila Melebihi `

Cara Mengendalikan `std::endl` Apabila Melebihi `

Susan Sarandon
Lepaskan: 2024-12-07 04:25:21
asal
330 orang telah melayarinya

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

Operator terlebih muatan<< dengan Pengendalian endl Tersuai

Apabila membebankan operator<< operator, adalah mungkin untuk menghadapi ralat kompilasi apabila cuba menggunakan std::endl. Ralat ini berlaku kerana pengkompil tidak dapat mencari pengendali yang sesuai<< pelaksanaan untuk mengendalikan jenis std::endl.

Untuk menyelesaikan masalah ini, anda perlu memahami bahawa std::endl bukan objek, sebaliknya fungsi. Untuk menampung ini, std::cout mempunyai operator sendiri<< beban berlebihan yang secara khusus mengambil penunjuk fungsi dengan tandatangan yang sama seperti std::endl. Apabila dipanggil, beban lampau ini memanggil fungsi dan menyebarkan nilai pulangan.

Untuk mendayakan strim tersuai mengendalikan std::endl, pendekatan yang serupa diperlukan. Berikut ialah contoh kod yang menunjukkan perkara ini:

#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;
}

Dalam kod ini, kami mempunyai:

  • Operator terlampau beban<< untuk MyStream mengendalikan jenis dan fungsi generik dengan tandatangan tersuai.
  • Mentakrifkan fungsi endl tersuai yang mencetak baris baharu dan maklumat tambahan.
  • Operator terlampau beban<< untuk MyStream menerima penuding fungsi std::endl sebagai hujah.

Pendekatan ini membenarkan strim tersuai, seperti MyStream dalam contoh, menyokong std::endl dan menyediakan gelagat tersuai apabila menggunakannya.

Atas ialah kandungan terperinci Cara Mengendalikan `std::endl` Apabila Melebihi `. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan