2011-02-01 1 views
2

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

EDIT: Уточнение, почему меня это интересует, а не часть вопроса. Как указано в комментариях, вот какой-то код, объясняющий решающее различие, которое я вижу между полиморфизмом времени компиляции и временем выполнения. Представьте, что у вас есть полиморфный тип времени компиляции, что в основном означает, что у вас есть два типа, которые имеют общую концепцию (не интерфейс). Если вы хотите применить алгоритм этого полиморфного типа, он будет иметь порождающие:

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

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

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

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

+0

Есть ли какая-то особая причина, по которой вы не обращаетесь к итераторам STL? Или это просто из любопытства? – templatetypedef

+0

В управляемом C++, да (это тот же интерфейс, который вы видите на C# и VB.Net). В стандартном C++ нет (и вам лучше использовать другой язык для обработки операций с базой данных). –

+0

@templatetypedef: Оба. Если вас действительно интересует, почему, см. * Lots * моих комментариев там: http://stackoverflow.com/questions/4852658/polymorphic-iterators-in-c –

ответ

1

Одним из примеров альтернативы будет Qt4 introducing Java-Style iterators:

QList<int> list; 
... 
QListIterator<int> i(list); 
while (i.hasNext()) 
    sum += i.next(); 
+5

Это нечестно, Qt - Qt, а не C++ :) –

+0

@Georg: Интересно, что я предпочитаю делать операции в другом порядке. Вместо того, чтобы иметь 'bool hasNext() const' и' T next() ', я бы предпочел иметь' T get() const' и 'bool next()', потому что я мог бы «разыменовать» элемент несколько раз , –

+0

@Matthieu M .: Вот как это делается в java, я уверен, что у них были веские причины, чтобы сделать это таким образом ... или просто сделали это неправильно :) –

2

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

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

+0

Для меня разница огромная. Алгоритмы для полиморфных типов времени выполнения не обязательно должны быть общими, в то время как полиморфизм времени компиляции может обрабатываться только с использованием общих алгоритмов. Это полностью изменяет код, как если бы он был написан на каком-то другом языке. Так что это важно, по крайней мере. Постскриптум Спасибо за ссылку, очень интересно. –

+0

@ 7vies: Алгоритмы полиморфизма во время выполнения ничем не отличаются от алгоритмов полиморфизма во время компиляции - вы определяете интерфейс, а затем реализуете его.Независимо от того, определяете ли вы этот интерфейс как концепцию времени компиляции или ABC во время выполнения, не меняется тот факт, что вы реализуете интерфейс. – Puppy

+3

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