Форум программистов, компьютерный форум CyberForum.ru

Реализация энумератора - C++

Восстановить пароль Регистрация
 
Basie
1 / 1 / 0
Регистрация: 27.12.2012
Сообщений: 8
28.12.2012, 00:00     Реализация энумератора #1
Пишу C++ аналог Enumerator'ов из .NET на основе стандартных итераторов. Сейчас интерфейс класса выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template < typename STLiterator >
class Enumerator {
public:
    Enumerator ( ) : _current(_end), _next(_end) { }
    Enumerator ( STLiterator begin, STLiterator end )
        : _current(begin), _next(begin), _end(end) { }
 
    bool operator ++ ( ) ; // Переход к следующему элементу
    ? operator * ( ); // Получение значения текущего элемента ("разыменование")
    ? operator -> ( ? ); // Доступ к членам элемента
 
private:
    STLiterator _current, _next, _end;
};
Класс должен работать с любыми классами, у которых есть обычный итератор (с операторами ++, *, ->) включая указатели.
Конструктор получает стандартные итераторы begin()/end() (или constBegin()/constEnd()), либо, в случае указателей, - начальное и конечное смещения.
Оператор ++ при вызове пытается сместиться к следующему элементу последовательности и, если это удалось, возвращает true, иначе (если дошли до конца) - false. Для доступа к самому первому элементу ++ тоже необходимо предварительно вызвать.
Операторы * и -> должны предоставлять доступ к значению текущего элемента и к его членам соответственно.
Вопрос: какими должны быть типы и параметры, вместо которых в интерфейсе стоят знаки вопроса? Как грамотно расставить const и & у этих типов?
P. S. Те, кому режет глаза перегрузка операторов ++ и *, могут в своём ответе использовать вместо них методы next и value с теми же параметрами/типом возвращаемого значения.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2012, 00:00     Реализация энумератора
Посмотрите здесь:

C++ Реализация класса
C++ Реализация
C++ реализация класса
Реализация crc C++
C++ Реализация комбинаторики
Реализация условия C++
C++ реализация предикатов
C++ Реализация вектора

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
28.12.2012, 00:26     Реализация энумератора #2
Для -> надо возвращать STLiterator value type*.
Для * надо возвращать STLiterator value type&
По поводу константности - входящие итераторы могут быть как константными, так и не константными. Возможно, нужно несколько реализаций
Basie
1 / 1 / 0
Регистрация: 27.12.2012
Сообщений: 8
28.12.2012, 01:57  [ТС]     Реализация энумератора #3
A STLiterator value type нужно включить ещё одним параметром в шаблон?

И ещё: может быть можно как-то вывернуться и возвратить то, что возвращают соответствующие операторы STLiterator? Например вместо * и -> сделать оператор преобразования:
C++
1
2
3
operator const STLiterator & ( ) const {
    return _current;
}
и чтобы операции * и -> , применённые к энумератору, делегировались через это неявное преобразование к _current'у, но при этом защитить последний const'ами от несанкционированного изменения? (Но чтобы само значение, на которое указывает _current, можно было бы менять, если, конечно, он не const_iterator - поправьте, если const'ы стоят не так).
Yandex
Объявления
28.12.2012, 01:57     Реализация энумератора
Ответ Создать тему
Опции темы

Текущее время: 21:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru