IEnumerable в C ++? - PullRequest
       33

IEnumerable в C ++?

2 голосов
/ 01 февраля 2011

Я хотел бы знать, существует ли распространенный способ представления высокоуровневых объектов в виде списков в C ++, , кроме использования итераторов STL . (под высокоуровневым я имею в виду некоторые сложные объекты, скажем, ответ базы данных, в отличие от низкоуровневого вектора). Возможно, что-то похожее на C # IEnumerable. Если вы видели какие-либо проекты, использующие это, не могли бы вы дать мне ссылку? Спасибо.

РЕДАКТИРОВАТЬ: Уточнение, почему я заинтересован в этом, а не часть вопроса. Как указано в комментариях, здесь приведен код, объясняющий принципиальное различие, которое я вижу между полиморфизмом во время компиляции и во время выполнения. Представьте, что у вас есть полиморфный тип во время компиляции, что в основном означает, что у вас есть два типа, которые имеют общую концепцию (не interface ). Если вы хотите применить алгоритм к этому полиморфному типу, он будет иметь , чтобы быть универсальным:

template<class iterator>
void myalgorithm(iterator iter) {...}

Но если у вас есть полиморфный тип времени выполнения с интерфейсом, скажем, IMyIterator, вы можете написать «нормальные» неуниверсальные алгоритмы для него

void myalgorithm(IMyIterator* iter) {...}

Огромная разница в реализации этих двух функций заключается в различном уровне поддержки языка и IDE для работы с интерфейсами по сравнению с универсальными типами. Другое дело, что не все знакомы с программированием шаблонов, как, вероятно, вы. Наконец, второй случай позволяет скрыть реализацию, а первый - только заголовок. Поэтому, пожалуйста, не говорите мне, что между ними нет разницы, если только вы не покажете мне, где я неправ.

Ответы [ 3 ]

2 голосов
/ 01 февраля 2011

Вы можете использовать SCARY итераторы . База данных - это один из примеров того, где итерация SCARY превосходит.

Однако C # IEnumerable<T> на самом деле ничем не отличается от итерации STL, за исключением того, что полиморфизм происходит во время выполнения, а не во время компиляции. Не должно быть слишком сложно написать собственный полиморфизм во время выполнения поверх него.

1 голос
/ 01 февраля 2011

Одним из примеров альтернативы будет Qt4, представляющий итераторы в стиле Java :

QList<int> list;
...
QListIterator<int> i(list);
while (i.hasNext())
    sum += i.next();
0 голосов
/ 01 февраля 2011

вы также можете увидеть Boost :: FOR_EACH это упрощает синтаксис итерации.

...