<< est surchargé :
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";
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!