Ответ 1
Вот некоторые статьи, которые могут вас заинтересовать
Предоставление STL Iterators базового класса
Я пытаюсь найти общий способ доступа к набору контейнеров. У меня есть стандартный вектор и список в дополнение к другому пользовательскому списку.
Пользовательский список определяет итератор;
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 Iterators базового класса
Лучше поздно, чем никогда...
Последняя проблема C-Vu появилась и угадала, что было в ней: Правильно, итераторы, которые делают именно то, что вы хотели.
К сожалению, вам нужно стать членом ACCU, чтобы просмотреть журнал (статья ссылается на статью Overload от 2000 года, что Дэвид ссылки на). Но за ничтожную цену в год вы получаете хороший журнал для чтения, конференций и групп пользователей. Когда вы станете участником, вы можете просматривать PDF-обратные выпуски, поэтому что вы ждете?
Случай осторожности, о чем вы просите. В классах any_iterator вы видите работу с неограниченным набором типов итераторов. У вас всего три, которые вы знаете впереди. Конечно, вам может понадобиться добавить четвертый тип в будущем, но так что, если это займет O (1) дополнительных строк кода?
Большим преимуществом замкнутого набора возможных типов содержимого является то, что у вас есть верхняя граница sizeof(), что означает, что вы можете избежать кучи и косвенности, которую она приносит. В основном, залейте их все в boost:: variant и вызовите apply_visitor.