Delphi для ... in в C ++ Builder - PullRequest
       62

Delphi для ... in в C ++ Builder

0 голосов
/ 18 июня 2020

Delphi код

var
  BookNode, EntityNode: TXmlNode;
  Books: TXmlNodeList;
...
for BookNode in Books do

В компиляторе CLang в C ++ Builder

for (auto && BookNode : Books)

Как написать этот код в классе c компилятор?

Отсутствует свойство Count / RecordCount / Items->Count eg.

Я использую компилятор classi c, потому что некоторые компоненты не поддерживают CLang.

1 Ответ

3 голосов
/ 19 июня 2020

Компилятор classi c не поддерживает C ++ 11, поэтому вы не можете использовать на основе диапазона for l oop. Вместо этого вы должны использовать традиционный for l oop.

Delphi s for..in l oop основан на концепции Enumerator (см. Итерация над контейнерами с использованием операторов For ). Однако Delphi TXMLNodeList не реализует Enumerator, поэтому вы не можете использовать его в for..in l oop.

C ++ 11 на основе диапазона for l oop основан на концепции итераторов . Компиляторы CLang от Embarcadero реализуют итераторы для многих контейнеров в стиле Delphi, которые реализуют метод GetEnumerator() или свойства Count + operator[]. См. Поддержка итератора C ++ для Delphi перечислимых типов и контейнеров . В компиляторе classi c вам придется использовать такой доступ вручную, например:

for(Iterator iter = list->begin(); iter != list->end(); ++iter)
{
    ElementType &elem = *iter;
    ...
}
for(int index = 0; index < list->Count; ++index)
{
    ElementType &elem = (*list)[index]; // or list->Items[index], etc...
    ...
}
EnumeratorType *enum = list->GetEnumerator();
while (enum->MoveNext())
{
    ElementType elem = enum->Current;
    ...
}

Несмотря на ваше утверждение, Delphi s TXMLNodeList ДЕЙСТВУЕТ имеют свойства publi c Count и Nodes[] (унаследованные от интерфейса IXMLNodeList) для индексации через узлы (Delphi s XML фреймворк предшествовал C ++ 11, в конце концов), например:

_di_IXMLNodeList Books;
...
for(int i = 0; i < Books->Count; ++i)
{
    _di_IXMLNode BookNode = Books->Nodes[i];
    ...
}

UPDATE : вышеприведенное было основано на предположении, что вы использовали Embarcadero XML framework , имеющий собственные классы TXMLNode и TXMLNodeList. Основываясь на вашем комментарии о том, что вы фактически используете вместо него VerySimple XML, который имеет классы с аналогичными названиями, я посмотрел на его код и увидел, что его класс TXmlNodeList является производным от Delphi TObjectList<T> класс, который имеет свойства publi c Count и Items[]. Итак, вы можете использовать их в for l oop, например:

TXMLNodeList *Books;
...
for(int i = 0; i < Books->Count; ++i)
{
    TXMLNode *BookNode = Books->Items[i];
    ...
}
...