Un adaptateur d'itérateur C ++ qui enveloppe et cache un itérateur interne et convertit le type itéré

Avoir joué avec cette je soupçonne que ce n'est pas à distance possible, mais j'ai pensé que je demanderais aux experts. J'ai le code C++ suivant:

classe IInterface 
{ 
virtual void SomeMethod() = 0; 
}; 

Objet de classe 
{ 
IInterface* GetInterface() { ... } 
}; 

classe de Conteneur 
{ 
privé: 
struct Point 
{ 
Objet* pObject; 
[... autres membres ...] 
}; 
std::list<Item> m_items; 
}; 

Je tiens à ajouter que ces méthodes Conteneur:

 MagicIterator<IInterface*> Begin(); 
MagicIterator<IInterface*> (); 

Afin que les appelants peut écrire:

Container c = [...] 
pour (MagicIterator<IInterface*> i = c.Begin(); i != c.End(); i++) 
{ 
IInterface* pItf = *i; 
[...] 
} 

Donc, essentiellement, je veux fournir une classe qui semble être une itération sur certains de la collection (qui à l'appelant de Begin() et End() n'est pas autorisé à voir) de IInterface pointeurs, mais qui est en fait une itération sur une collection de pointeurs vers d'autres objets (privé de la classe Container) qui peuvent être convertis en IInterface pointeurs.

Quelques points clés:

  • MagicIterator doit être défini en dehors de Container.
  • Container::Item doit rester privé.
  • MagicIterator a pour itérer sur IInterface pointeurs, malgré le fait que Container est titulaire d'un std::list<Container::Item>. Container::Item contient un Object*et Object peut être utilisé pour récupérer IInterface*.
  • MagicIterator doit être réutilisable plusieurs classes qui ressemblent à des Conteneurs, mais pourrait en interne ont différents pour les implémentations de la tenue de différents objets (std::vector<SomeOtherItem>mylist<YetAnotherItem>) et avec IInterface* obtenus d'une manière différente à chaque fois.
  • MagicIterator ne doit pas contenir de conteneur de code spécifiques, mais il peut déléguer à des classes qui ne sont, à condition que cette délégation n'est pas codé en dur pour notamment les conteneurs à l'intérieur de MagicIterator (donc en quelque sorte résolu automatiquement par le compilateur, par exemple).
  • La solution doit compilation sous Visual C++ sans utiliser d'autres bibliothèques (comme boost) qui aurait besoin d'un accord de licence à partir de leurs auteurs.
  • Aussi, l'itération ne peut allouer de la mémoire de masse (donc pas de new() ou malloc() à toute étape), et pas de memcpy().

Merci pour votre temps, même si vous êtes juste en train de lire; cela a vraiment été m'énerve!

mise à Jour: Alors que j'ai eu des réponses très intéressantes, aucun ne répondait à toutes les exigences ci-dessus encore. Notamment les zones difficiles d'accès sont: i) le découplage MagicIterator de Conteneur en quelque sorte (modèle par défaut arguments ne coupe pas), et ii) d'éviter d'allocation de tas; mais je suis vraiment après une solution qui couvre l'ensemble de la ci-dessus balles.

source d'informationauteur