Maison > développement back-end > C++ > Comment gérer `std::endl` lors de la surcharge du `

Comment gérer `std::endl` lors de la surcharge du `

Susan Sarandon
Libérer: 2024-12-07 04:25:21
original
330 Les gens l'ont consulté

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

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 :

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal