Maison >développement back-end >C++ >Comment gérer `std::endl` dans la surcharge de l'opérateur de flux personnalisé ?
<< est surchargé :
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";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 { templateMyStream& 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!