2011-04-06 2 views
2

J'ai une classe conteneur (appelée Atom) dans laquelle je veux stocker les objets de type Term. De nombreux constructeurs de conteneurs STL ont la forme Container(Iterator first, Iterator last) pour initialiser le conteneur avec un ensemble d'éléments.STL-Conteneurs et itérateurs pointant vers un type spécifique (C++)

Maintenant, j'aimerais pouvoir utiliser ce formulaire pour ma classe Atom, mais je ne sais pas comment lier l'itérateur à sa classe de conteneur. Par exemple, actuellement j'ai:

class Atom { 
public: 
    Atom(std::string str, 
    std::vector<Term>::const_iterator start, 
    std::vector<Term>::const_iterator end); 

Ceci seulement permis itérateurs de vecteur. Comment puis-je généraliser le type d'itérateur que je prends?

Répondre

8

Chaque fois que vous devez généraliser sur les types, pensez modèles:

class Atom { 
public: 
    template <typename ForwardIterator> 
    Atom(std::string str, 
    ForwardIterator start, 
    ForwardIterator end); 

Maintenant, juste itérer sur la plage, quelle qu'elle soit.

1

Vous pouvez déclarer le constructeur comme modèle. Traitez simplement start et end comme des itérateurs et s'ils prennent en charge cette interface, ils fonctionneront. Ne vous inquiétez pas de forcer les itérateurs à gérer le type Term. Si le constructeur de la copie peut le convertir en Term cela fonctionnera.

Le constructeur pourrait ressembler à:

template<typename I> Atom(std::string str, I start, I end); 
Questions connexes