Вместо того, чтобы одна функция-член возвращала контейнер, рассмотрите возможность использования функций begin()
и end()
, которые возвращают диапазон итератора, аналогично тому, что делают контейнеры стандартной библиотеки:
class terminal;
class terminal_iterator { /* defined appropriately */
struct symbol
{
terminal_iterator begin_terminals() const;
terminal_iterator end_terminals() const;
};
Еслиу вас уже есть std::vector<terminal>
где-то, что вы собираетесь перебирать, вы можете просто typedef terminal const* terminal_iterator;
(или использовать аналогичный typedef) и соответственно определить функции-члены.
Если у вас нетКонтейнер (т. е. функция-член материализует саму последовательность), вы можете написать собственный класс итератора, который генерирует последовательность.
Обеспечение доступа к диапазонам begin()
и end()
иногда немного сложнее, чемпросто предоставляя средство доступа для контейнера, но средства доступа к диапазону обеспечивают большую гибкость и абстракцию.