Maison >développement back-end >C++ >Comment puis-je faire fonctionner mon type personnalisé avec des boucles For basées sur une plage C ?

Comment puis-je faire fonctionner mon type personnalisé avec des boucles For basées sur une plage C ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-18 14:39:19931parcourir

How Can I Make My Custom Type Work with C   Range-Based For Loops?

Personnalisation des types pour les boucles For basées sur une plage

Pour faire fonctionner un type personnalisé avec des boucles For basées sur une plage, vous pouvez spécifier start( ) et end() pour votre type. Ces méthodes doivent renvoyer des itérateurs qui permettent à la boucle de parcourir les éléments de votre type.

Considérations sur l'espace de noms

Si votre type personnalisé appartient à un espace de noms, vous devez définir begin() et end() dans cet espace de noms. Par exemple, si votre type est xml::my_type, vous devez définir xml::begin() et xml::end() pour le rendre accessible à la boucle for basée sur une plage.

Exigences pour Begin() et End()

Les méthodes Begin() et End() que vous définissez doivent satisfaire aux exigences suivantes :

  • Elles doivent renvoie des itérateurs ou des objets qui agissent comme des itérateurs.
  • Ils doivent fournir les opérateurs et les fonctionnalités nécessaires pour que la boucle for basée sur une plage fonctionne correctement, y compris les éléments suivants :

    • Opérateur d'incrémentation de préfixe ( )
    • Opérateur de comparaison (!=)
    • Opérateur de déréférencement (*)
    • Destructeur public

Deux options pour implémenter Begin() et End()

Là Il existe deux approches principales pour implémenter Begin() et End() pour votre type personnalisé :

  1. Membre fonctions : Créez begin() et end() en tant que fonctions membres de votre type. C'est l'approche privilégiée lorsque vous contrôlez l'implémentation de votre type.
  2. Fonctions libres : Définissez des fonctions libres nommées start() et end() en dehors de votre type, en prenant votre type comme une dispute. Cette approche est utile lorsque vous ne contrôlez pas l'implémentation de votre type mais que vous souhaitez tout de même le rendre compatible avec les boucles for basées sur une plage.

Exemple :

Considérons l'exemple suivant :

struct my_type {
    int data[5];

    // Define begin() and end() as member functions
    int* begin() { return &data[0]; }
    int* end() { return &data[5]; }
};

En définissant ces fonctions membres, les instances de my_type peuvent désormais être itérées à l'aide d'une plage pour les boucles :

my_type mt;
for (int& value : mt) {
    // Do something with each value in mt
}

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!

Déclaration:
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