Maison >développement back-end >C++ >Comment puis-je rendre mes types C personnalisés itérables à l'aide de boucles For basées sur une plage ?

Comment puis-je rendre mes types C personnalisés itérables à l'aide de boucles For basées sur une plage ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-23 22:03:09604parcourir

How Can I Make My Custom C   Types Iterable Using Range-Based For Loops?

Simplification des itérations avec des types personnalisés

En C 11, l'introduction de boucles for basées sur des plages a simplifié le processus d'itération sur les séquences. Ces boucles suivent un modèle standardisé :

for (Type& v : a) { ... } // equivalent to traditional loop below
for (auto iv = begin(a); iv != end(a); ++iv) {
  Type& v = *iv;
  ...
}

Vous pouvez étendre cette fonctionnalité à vos types personnalisés, leur permettant d'être utilisés dans des boucles basées sur une plage, en suivant ces directives :

Approche 1 : Déclaration de fonction membre

  • Définissez les fonctions membres start() et end() dans votre type X qui renvoient des objets de type itérateur comportement.

Approche 2 : Invocation de fonction gratuite

  • Créez des fonctions gratuites start(X&) et end(X&) dans le même espace de noms que votre type X, en renvoyant à nouveau l'itérateur -like objets.

Ces fonctions fourniront les points d'initialisation (begin()) et de terminaison (end()) nécessaires pour le boucle basée sur une plage.

Exigences relatives à la valeur de retour de la fonction

Les objets renvoyés par start() et end() n'ont pas besoin d'être de véritables itérateurs. Ils doivent cependant répondre aux exigences suivantes :

  • Surcharge préalable pour incrémenter l'objet
  • Assurer des expressions d'initialisation valides
  • Prise en charge du binaire != pour un contexte booléen
  • Implémentez unaire * pour renvoyer une valeur attribuable à la variable de boucle
  • Fournir un public destructor

Considérations supplémentaires

  • Si votre type personnalisé appartient à l'espace de noms XML, définissez xml::begin() pour éviter les conflits potentiels avec std::begin().
  • Les futures révisions du C pourraient découpler les types de start() et end(), permettant une "fin paresseuse" évaluation.
  • C 17 a introduit un nouveau type, null_sentinal_t, qui facilite les boucles basées sur une plage sur des tampons de caractères terminés par un caractère nul.
  • La boucle basée sur la plage utilise des variables temporaires stockées dans des références auto&&, qui signifie que vos surcharges start() et end() ne peuvent pas détecter si elles fonctionnent sur des temporaires.

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