Общий итератор - PullRequest
       36

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

29 голосов
/ 13 августа 2008

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

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

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

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

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

Ответы [ 3 ]

19 голосов
/ 13 августа 2008
1 голос
/ 24 сентября 2008

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

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

1 голос
/ 14 августа 2008

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

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

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

...