2009-06-05 4 views
10

C#에서는 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는이 서비스를 제공하지 않으므로 수동으로해야합니다. 각 인터페이스를 구현하는 클래스 두 개를 작성하십시오 (또는 C# 컴파일러와 같은 방식으로 구현하는 클래스 하나를 구현하는 클래스지만 if 모든 것은 반복적으로 호출 될 수 있습니다 - 큐 : 상태 유지).

여기에 작은 예입니다 - 내가 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); 
관련 문제