2009-06-05 6 views
10

Czでは、yieldキーワードを使ってジェネレータを実装できます。C++/CLIでの収穫は可能ですか?

int GenInt() 
{ 
    for(int i = 0; i < 5; i++) 
     yield return i; 
} 

次に、関数を複数回呼び出すと0〜4が返されます。

C++/CLI? yieldというキーワードはありません。私の嫌な反応は、そうではないことです。それはうんざりですが、何ができますか?

+2

これはどのように 'yield'作品ではありません。あなたは 'IEnumerable 'としてリターンを指定する必要があります。 – IllidanS4

答えて

17

C++/CLIでも同じことができますか?利回りのキーワードはないので、私の腸の反応はない、それは吸うが、あなたは何ができますか? C#で

yield returnコンパイラはIEnumerable<T>IEnumerator<T>の実装を実装してあなたのために必要なコードを生成することができますただのショートカットです。 C++/CLIはこのサービスを提供していないので、手動で行う必要があります。各インタフェースを実装するクラスを2つ作成します(または、C#コンパイラのように1つのクラスで両方を実装しますが、すべてを繰り返し呼び出すことができます - キュー:ステートフル)。ここで

は小さな例だ - 私はIDEを持っていないし、私のC++/CLIは少し錆びているので、私はC#で、それをあげる:

class MyRange : IEnumerable<int> { 
    private class MyRangeIterator : IEnumerator<int> { 
     private int i = 0; 

     public int Current { get { return i; } } 

     object IEnumerator.Current { get { return Current; } } 

     public bool MoveNext() { return i++ != 10; } 

     public void Dispose() { } 

     void IEnumerator.Reset() { throw new NotImplementedException(); } 
    } 

    public IEnumerator<int> GetEnumerator() { return new MyRangeIterator(); } 

    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } 
} 

// Usage: 
foreach (int i in new MyRange()) 
    Console.WriteLine(i); 
関連する問題