C ++ / CLI可以产生吗?

时间:2009-06-05 14:37:48

标签: .net c++-cli

在C#中,我可以使用yield关键字来实现生成器,即:

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

然后,多次调用该函数将返回0到4。

可以在C ++ / CLI中完成同样的事情吗?没有yield关键字,所以我的直觉反应是没有,这很糟糕,但你能做什么?

1 个答案:

答案 0 :(得分:18)

  

可以在C ++ / CLI中完成同样的事情吗?没有yield关键字,所以我的直觉反应是没有,这很糟糕,但你能做什么?

C#中的

yield return只是一种快捷方式,它允许编译器为您生成实现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);