Opérateur de surcharge<< avec gestion finale personnalisée
Lors de la surcharge de l'opérateur<< opérateur, il est possible de rencontrer des erreurs de compilation lors de la tentative d'utilisation de std::endl. Cette erreur se produit car le compilateur ne parvient pas à trouver un opérateur<< implémentation pour gérer le type std::endl.
Pour résoudre ce problème, il est nécessaire de comprendre que std::endl n'est pas un objet, mais plutôt une fonction. Pour cela, std::cout a son propre opérateur<< surcharge qui prend spécifiquement un pointeur de fonction avec la même signature que std :: endl. Lorsqu'elle est appelée, cette surcharge appelle la fonction et propage la valeur de retour.
Pour permettre aux flux personnalisés de gérer std::endl, une approche similaire est requise. Voici un exemple de code qui démontre cela :
#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; } Dans ce code, nous avons :
- Opérateur surchargé<< pour que MyStream gère les types et fonctions génériques avec une signature personnalisée.
- Définition d'une fonction endl personnalisée qui imprime une nouvelle ligne et des informations supplémentaires.
- Opérateur surchargé<< pour que MyStream accepte le pointeur de fonction de std::endl comme argument.
Cette approche permet aux flux personnalisés, comme MyStream dans l'exemple, de prendre en charge std::endl et de fournir des comportements personnalisés lors de son utilisation.
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!