Общий итератор

Я пытаюсь найти общий способ доступа к набору контейнеров. У меня есть стандартный вектор и список в дополнение к другому настраиваемому списку.

Пользовательский список определяет итератор;

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;
};

Но, очевидно, это все итераторы разных типов. Однако я могу предположить, что все контейнеры одного типа.

Есть ли элегантный способ решить эту проблему?

13.08.2008 15:22:47
3 ОТВЕТА
РЕШЕНИЕ
19
13.08.2008 15:47:35
Томас Беккер (автор второй ссылки выше) имеет более длинную статью, которая превосходна: artima.com/cppsource/type_erasure.html
Adrian 9.01.2009 17:04:16

Лучше поздно, чем никогда...

Появилась последняя проблема C-Vu и угадайте, что в ней было: верно, итераторы, которые делают именно то , что вы хотели.

К сожалению, вам нужно стать членом ACCU для просмотра журнала (статья ссылается на статью о перегрузке 2000 года, на которую ссылается Дэвид). Но за бесценную цену в год вы получаете хороший журнал для чтения, конференции и группы пользователей. Когда вы станете участником, вы сможете просмотреть PDF-файлы прошлых выпусков, чего же вы ждете ?

1
14.08.2008 11:09:02
Было бы полезно, если бы вы упомянули, что эту статью можно найти в выпуске 20 июня от 3 июня 2008 года под названием Custom Iterators in C ++. хорошая картинка пользователя кстати.
danio 8.07.2010 09:39:11

Случай быть осторожным, что вы просите. Классы any_iterator, которые вы видите, работают с неограниченным набором типов итераторов. У вас есть только три, которые вы знаете заранее. Конечно, вам может понадобиться добавить четвертый тип в будущем, но что, если это потребует O (1) дополнительных строк кода?

Большим преимуществом закрытого набора возможных содержащихся типов является то, что у вас есть верхняя граница для sizeof (), что означает, что вы можете избежать кучи и косвенного обращения, которое она приносит. По сути, поместите их в boost :: option и вызовите apply_visitor.

1
24.09.2008 15:44:41