Я пытаюсь найти общий способ доступа к набору контейнеров. У меня есть стандартный вектор и список в дополнение к другому настраиваемому списку.
Пользовательский список определяет итератор;
class Iterator: public std::iterator<std::forward_iterator_tag, T> {
// ...
}
Iterator begin() {
return (Iterator(root));
}
Iterator end() {
return (Iterator(NULL));
}
с соответствующими операторами перегружены.
В идеале я хотел бы сделать это;
class Foo {
public:
Foo() {
std::list<int> x;
std::vector<int> y;
custom_list<int> z;
iter = x.begin(); // OR
iter = y.begin(); // OR
iter = z.begin();
// ...
};
private:
std::iterator<int> iter;
};
Но, очевидно, это все итераторы разных типов. Однако я могу предположить, что все контейнеры одного типа.
Есть ли элегантный способ решить эту проблему?
Вот несколько статей, которые могут вас заинтересовать
Предоставление итераторов STL базового класса
Лучше поздно, чем никогда...
Появилась последняя проблема C-Vu и угадайте, что в ней было: верно, итераторы, которые делают именно то , что вы хотели.
К сожалению, вам нужно стать членом ACCU для просмотра журнала (статья ссылается на статью о перегрузке 2000 года, на которую ссылается Дэвид). Но за бесценную цену в год вы получаете хороший журнал для чтения, конференции и группы пользователей. Когда вы станете участником, вы сможете просмотреть PDF-файлы прошлых выпусков, чего же вы ждете ?
Случай быть осторожным, что вы просите. Классы any_iterator, которые вы видите, работают с неограниченным набором типов итераторов. У вас есть только три, которые вы знаете заранее. Конечно, вам может понадобиться добавить четвертый тип в будущем, но что, если это потребует O (1) дополнительных строк кода?
Большим преимуществом закрытого набора возможных содержащихся типов является то, что у вас есть верхняя граница для sizeof (), что означает, что вы можете избежать кучи и косвенного обращения, которое она приносит. По сути, поместите их в boost :: option и вызовите apply_visitor.