Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 2

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

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

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

Ответ 3

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

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