2012-03-09 17 views
8

mogę wykonać następujące czynności w C++Czy istnieje metoda rodzajowa foreach w Delphi za które można nazwać z anonimowej funkcji

for_each(vec->begin(), vec->end(), [](int n){cout << n << " " << endl;}); 

chciałbym zrobić to samo/podobnie w Delphi. Prosiłem wcześniej do deweloperów C++ o wersję question i chciałem stworzyć podobny przykład w OOP Pascal. Część lambda (metoda anonimowa) nie jest istotna, ale zastanawiałem się, czy mógłbym zrobić to samo w Delphi XE2.

Pytam, ponieważ mam XE i nie jestem pewien, czy został dodany. Dzięki.

Odpowiedz

6

Prawdopodobnie najbliższym analogiem Delphi do std::vector<T> jest TList<T>. Można iteracyjne nad listy z for in pętli:

var 
    Item: Integer; 
    List: TList<Integer>; 
.... 
for Item in List do 
    Writeln(Item); 

Jeśli masz dynamicznej tablicy zamiast TList<T> następnie można użyć for in iteracyjne nad elementów. W rzeczywistości wszystkie wbudowane pojemniki obsługują for in i łatwo jest dodać obsługę for in do własnych klas.

W C++ nie ma nic takiego jak pętla for in, a więc idiomem jest użycie algorytmu STL. To właśnie powoduje, że używasz anonimowej funkcji. W Delphi ze składnią for in można wyrazić "iterację wszystkich elementów kontenera" w sposób naturalny bez odwoływania się do metod anonimowych.

Generics zostały dodane do Delphi w Delphi 2009, a pętla for in została dodana w Delphi 2005, więc wszystko to jest dostępne w XE. Warto dodać, że w Delphi 2009 dodano także anonim.

Należy zdać sobie sprawę z tego, że generics Delphi ma mniejszą moc niż szablony C++. Chociaż mówisz o generycznym foreach, twój kod nie jest generyczny w tym sensie, że wyspecjalizował się w int. Możesz napisać ogólną wersję swojego kodu w C++, ale byłoby to znacznie trudniejsze w przypadku generycznych elementów Delphi ze względu na nieodłączne ograniczenia generycznych w porównaniu do szablonów. Próba napisania powyższego kodu w sposób ogólny w Delphi byłaby założeniem w miejscu, w którym próbowałeś zadzwonić pod numer Writeln. Chociaż byłoby to trywialne w przypadku szablonów C++, jest to frustrująco niedostępne dla generycznych.

Aktualizacja: W komentarzach pytasz, czy istnieje łatwa metoda dodawania zawartości jednego kontenera do drugiego. Jest to zrobione za pomocą metody AddRange. TList<T>.AddRange() ma trzy przeciążone warianty, które otrzymują jeden z następujących parametrów wejściowych: array of T, Collection: IEnumerable<T> lub Collection: TEnumerable<T>. Wszystkie standardowe standardowe pojemniki mają podobny wzór.

+0

Tak to zrobiłem: dla i: = 0 do n - 1 do wyniku. Dodaj (i); Ale zastanawiałem się, czy taka ogólna funkcja istnieje :) – Mihaela

+3

Składnia Lambda/Closure/Anonfunction jest tak CLUNKY w delphi, że jest całkiem niezłe, że nie potrzebujesz go do pętli 'for'. Idiomy C++ jak zwykle nie tłumaczą się dobrze na paskal. Ale C# i Delphi są całkiem blisko. –

+0

Uważam, że jest całkiem przydatne w C++. Nie tylko jest to czystszy kod (w przypadku małych funkcji anonimowych), ale w C++ często jest wprowadzany i generuje szybszy kod. – Mihaela

Powiązane problemy