Может ли C ++ / CLI дать? - PullRequest
12 голосов
/ 05 июня 2009

В C # я могу использовать ключевое слово yield для реализации генератора, а именно:

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

Затем, многократный вызов функции вернет значение от 0 до 4.

Можно ли сделать то же самое в C ++ / CLI? Ключевого слова yield нет, поэтому моя внутренняя реакция такова: нет, что отстой, но что вы можете сделать?

1 Ответ

18 голосов
/ 05 июня 2009

Можно ли сделать то же самое в C ++ / CLI? Там нет ключевого слова yield, поэтому моя внутренняя реакция такова, что нет, что отстой, но что вы можете сделать?

yield return в C # - это просто ярлык, который позволяет компилятору сгенерировать необходимый вам код, который реализует реализацию IEnumerable<T> и IEnumerator<T>. Поскольку C ++ / CLI не предлагает эту услугу, вы должны сделать это вручную: просто напишите два класса, один, который реализует каждый интерфейс (или, как это делает компилятор C #, один класс, реализующий оба, но это может стать грязным, если все это можно назвать неоднократно - кий: государственность).

Вот небольшой пример - поскольку у меня нет 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...