python在C / C ++中的yield功能? [重复]

问题描述 投票:5回答:2

这个问题在这里已有答案:

我刚刚了解了python中的yield关键字 - 非常令人印象深刻且非常有用。

在C和C ++语言中是否有任何等价物?

c++ python c yield
2个回答
3
投票

虽然你可以使用yield编写惰性迭代器(参见std::iterator),但不是this answer。而不是像Python中那样使用yield,而是从operator++返回下一个元素。


1
投票

没有。

实现yield需要暂停执行,并且不适合只有一个堆栈(1)的C ++模型。实现通用yield的唯一方法是要求比C ++更低的级别(即显式地管理堆栈和执行上下文),这在C ++级别是无法移植的。

(1)C ++ 11引入了可移植线程,这意味着可以有多个堆栈,因此您可以模仿协同程序(可能非常低效):例如

#include <stdio.h>
#include <thread>
#include <mutex>

template<typename RV>
struct Generator {
    std::mutex a, b;
    bool done;
    RV *current;

    Generator() : done(false) {
        b.lock();
        std::thread([this](){ this->call_run(); }).detach();
    }

    void call_run() {
        this->run();
        done = true;
    }

    virtual void run() = 0;

    void yield(const RV & x) {
        a.lock();
        *current = x;
        b.unlock();
    }

    bool next(RV & res) {
        if (done) return false;
        current = &res;
        a.unlock();
        b.lock();
        return true;
    }
};

///////////////////////////////////////////////////////

struct Squares : Generator<int> {
    void run() override {
        for (int i=0; i<10; i++) {
            yield(i*i);
        }
    }
};

int main() {
    Squares sq;
    int x = -1;
    while(sq.next(x)) {
        printf("%i\n", x);
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.