C++/CLI 可以屈服吗?

发布于 2024-07-22 22:51:02 字数 258 浏览 4 评论 0原文

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

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

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

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

In C#, I can use the yield keyword to implement a generator, viz:

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

Then, calling the function multiple times will return 0 through 4.

Can the same thing be done in C++/CLI? There's no yield keyword, so my gut reaction is that there isn't, which sucks, but what can you do?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

等待我真够勒 2024-07-29 22:51:02

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

C# 中的 yield return 只是一个快捷方式,可让编译器为您生成实现 IEnumerableIEnumerator< 的实现的必要代码。 /代码>。 由于 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);

Can the same thing be done in C++/CLI? There's no yield keyword, so my gut reaction is that there isn't, which sucks, but what can you do?

yield return in C# is just a shortcut that lets the compiler generate the necessary code for you that implements an implementation of IEnumerable<T> and IEnumerator<T>. Since C++/CLI doesn't offer this service, you've got to do it manually: just write two classes, one that implements each interface (or, doing it like the C# compiler, one class implementing both but this can get messy if the whole thing can be called repeatedly – cue: statefulness).

Here's a small example – since I don't have an IDE and my C++/CLI is a bit rusty, I'll give it in 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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文