2012-03-09 23 views
8

で呼び出すことができ、そのためのDelphiでforeachの一般的な方法があります。 私はquestionを以前のC++開発者に尋ね、OOP Pascalで同様の例を作りたかったのです。 質問のラムダ(匿名メソッド)部分は実際には関係ありませんが、私がDelphi XE2でも同じことができるのではないかと思いました。私はDelphiで/同じ同様の操作を行いたい <pre><code>for_each(vec->begin(), vec->end(), [](int n){cout << n << " " << endl;}); </code></pre> <p>C++</p>で次の操作を行うことができます無名関数

私はXEを持っているので質問していますが、それが追加されているかどうかはわかりません。おかげさまで

答えて

6

おそらくstd::vector<T>に最も近いデルファイ類似体はTList<T>です。あなたが動的配列ではなくTList<T>を持っているなら、あなたは、要素を反復するfor inを使用することができます

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

:あなたはfor inループでリストを反復処理することができます。実際、すべての組み込みコンテナはfor inをサポートしており、for inのサポートを自分のクラスに追加するのは簡単です。

C++では、for inループのようなものはないので、イディオムはSTLアルゴリズムを使用することです。それが匿名機能を使用することにつながります。 for in構文のDelphiでは、匿名メソッドに頼ることなく、自然な方法で「コンテナのすべてのメンバーを繰り返し処理する」ことができます。

ジェネリックはDelphi 2009でDelphiに追加され、for inループはDelphi 2005で追加されたので、これはすべてXEで利用できます。それは価値があるため、Delphi 2009でも匿名性が追加されました。

DelphiのジェネリックスはC++のテンプレートよりも強力ではありません。一般的なforeachについて言及していますが、コードはintに特化しているという意味では一般的ではありません。あなたはC++でコードのジェネリックバージョンを書くことができますが、テンプレートと比べてジェネリックの固有の制限のためにDelphiのジェネリックスとはるかに難しいでしょう。 Delphiで一般的な方法で上記のコードを書き込もうとすると、Writelnを呼び出そうとした時点で創始者となります。 C++のテンプレートではそれほど簡単ではありませんが、ジェネリックのために手間がかかりません。

更新:コメントには、コンテナの内容を別のコンテナに追加するための滑らかな方法があるかどうかを尋ねるメッセージが表示されます。 AddRangeメソッドがそれを行います。 TList<T>.AddRange()には、array of T,Collection: IEnumerable<T>またはCollection: TEnumerable<T>のいずれかの入力パラメータを受け取る3つのオーバーロードされたバリアントがあります。すべての標準ジェネリックコンテナは、同様のパターンに従います。

+0

それは私がそれをした方法です:i:= 0〜n - 1 do result.Add(i);しかし、私はそのようなジェネリック関数が存在するかどうか疑問に思っていました。 – Mihaela

+3

ラムダ/クロージャ/アノオン関数の構文は、デルファイではCLUNKYなので、 'for'ループには必要ないことはかなり素晴らしいです。いつものようにC++のイディオムは、パスカルにうまく翻訳しないでください。しかし、C#とDelphiはかなり近いです。 –

+0

私はC++で非常に便利だと思います。コードは(小さな匿名関数に対して)より洗練されているだけでなく、C++ではインライン展開され、より高速なコードを生成することがよくあります。 – Mihaela

関連する問題

 関連する問題