modèles Je pense que je ne peux pas implémenter le conteneur de base sur un modèle de classe, ce qui nécessiterait alors un algorithme de traversée basé sur des classes de modèles qui ne sont pas connues à l'avance. Le conteneur de base peut être hérité et implémenté en utilisant n'importe quel type de conteneur (personnalisé ou standard) à l'intérieur. Voici quelques exemples de code pour le rendre clair:Utilisation d'Iterators pour masquer le conteneur interne et effectuer un fonctionnement générique sur un conteneur de base
struct MyObject {
int myInt;
}
// an abstract container
class BaseContainer {
public:
virtual void insertMyObject(MyObject& obj) = 0;
virtual iterator getFirst(); // the iterator type is for demonstration purposes only
virtual iterator getLast(); // the iterator type is for demonstration purposes only
}
// Sample container class that uses a std::vector instance to manage objects
class BaseContainer_Vector : public BaseContainer {
public:
void insertMyObject(MyObject& obj); // e.g. just pushes back to the vector
iterator getFirst(); // needs to override the iterator?
iterator getLast(); // needs to override the iterator?
private:
std::vector<MyObject> objectContainer;
}
Je vais donc avoir une liste d'objets de conteneurs, et je veux itérer sur ces deux conteneurs et les objets stockés.
std::vector<MyContainer*> containers;
for(int i=0 ; i<containers.size() ; i++){
iterator i = containers[i]->getFirst();
iterator iend = containers[i]->getLast();
for(; i != iend ; i++) {
std::cout << (*i).myInt << std::endl;
}
}
Je tiens en outre d'avoir un soutien pour la déclaration macro boost foreach. Il prend en charge les extensions tant que les fonctions range_begin et range_end sont correctes. Mais, l'exemple dans boost doc utilise std :: string :: iterator comme type de retour, alors que ce dont j'ai besoin est une classe d'itérateur générique et je n'ai pas encore trouvé comment faire cela.
std::vector<MyContainer*> containers;
for(int i=0 ; i<containers.size() ; i++){
BOOST_FOREACH(MyObject obj, *(containers[i])) {
std::cout << obj.myInt << std::endl;
}
}
Je pense que je peux définir ma propre classe itérateur, chaque classe qui étend BaseContainer devrait définir leur propre iterator étendre cette iterator de base. Pourtant, je préférerais utiliser des itérateurs standards (stl ou boost) pour supporter cette structure, plutôt que d'écrire mes propres itérateurs. Je suppose que cette approche fonctionnera, mais je suis ouvert aux commentaires concernant son efficacité.
Y a-t-il une approche réalisable qui peut résoudre ce problème avec élégance? Ou est-ce que je manque un point simple qui peut résoudre ce problème sans douleur?
Une question similaire peut être trouvée here, mais les solutions proposées semblent un peu complexes pour mes besoins, et les exigences diffèrent autant que je peux comprendre.
Quel est le cas d'utilisation réel auquel vous faites face?Avez-vous vraiment besoin de deux versions dynamiquement sélectionnées du conteneur ou pouvez-vous le pousser pour compiler l'heure? –
Je ne sais pas si ça va bien fonctionner avec STL et boost. Ceux-ci supposent généralement que les itérateurs sont des types de valeurs simples; Si vous utilisez des conceptions polymorphes, les types de valeur ne seront pas utilisables. – visitor
La bibliothèque que je développe devra permettre aux utilisateurs de définir leurs propres conteneurs et de les enregistrer dans le système. Le système itère sur tous les conteneurs enregistrés et les traite, ce que j'ai montré un exemple de code qui utilise boost. Le système est également responsable d'insérer automatiquement les types MyObject dans ce conteneur. Je souhaite que l'utilisateur puisse étendre cette classe de conteneur afin qu'il puisse appliquer l'ordre qu'il souhaite sur la structure qu'il utilise pour gérer ces objets insérés. – AdilYalcin