Maison > développement back-end > C++ > Comment gérer `std::endl` dans la surcharge de l'opérateur de flux personnalisé ?

Comment gérer `std::endl` dans la surcharge de l'opérateur de flux personnalisé ?

DDD
Libérer: 2024-12-08 08:26:12
original
238 Les gens l'ont consulté

<< est surchargé :

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

Bien que cela fonctionne comme prévu, la tentative d'utilisation de my_stream << endl entraîne une erreur de compilation indiquant "binaire '<<' : aucun opérateur trouvé prenant un opérande de gauche de type 'UIStream'..."

Pour résoudre ce problème, il est important de comprendre que std::endl n'est pas un objet mais une fonction. Dans std::cout, il est utilisé en implémentant l'opérateur<< pour accepter un pointeur de fonction avec la même signature que std::endl. Lorsqu'elle est appelée, la fonction est invoquée et sa valeur de retour est transmise.

Une implémentation personnalisée de l'opérateur<< peut être défini pour gérer std::endl de la même manière :

template <typename T>
UIStream& operator<< (const T);

UIStream my_stream;
my_stream << 10 << " heads";
Copier après la connexion
Cette implémentation personnalisée définit un opérateur<< qui accepte deux types :

Le premier type est un pointeur de fonction générique qui prend une référence à l'objet MyStream et renvoie une référence au même objet.

Le deuxième type est un pointeur de fonction qui prend spécifiquement une référence à un objet MyStream et renvoie une référence au même objet.

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&);

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

Cela permet la mise en œuvre d'un endl personnalisé fonction qui fonctionne sur le flux personnalisé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal