Стили и итераторы STL-контейнера, указывающие на определенный тип (C ++) - PullRequest
2 голосов
/ 06 апреля 2011

У меня есть класс контейнера (называемый Atom), в котором я хочу хранить объекты типа Term. Многие конструкторы контейнеров STL имеют форму Container(Iterator first, Iterator last) для инициализации контейнера с некоторым набором элементов.

ТеперьЯ хотел бы иметь возможность использовать эту форму для моего класса Atom, но я не уверен, как отсоединить итератор от его контейнерного класса.Например, в настоящее время у меня есть:

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

Это разрешены только векторные итераторы.Как я могу обобщить тип итератора, который я использую?

Ответы [ 2 ]

8 голосов
/ 06 апреля 2011

Всякий раз, когда вам нужно обобщить типы, подумайте о шаблонах:

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

Теперь просто переберите диапазон, каким бы он ни был.

1 голос
/ 06 апреля 2011

Вы можете объявить конструктор как собственный шаблон. Просто относитесь к start и end как к итераторам, и если они поддерживают этот интерфейс, они будут работать. Не беспокойтесь о том, чтобы заставить итераторы обрабатывать тип Term. Если конструктор копирования может преобразовать его в Term, он будет работать.

Конструктор может выглядеть так:

template<typename I> Atom(std::string str, I start, I end);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...