python在C / C ++中的yield功能?

时间:2013-12-04 18:32:55

标签: c++ python c yield

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

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

2 个答案:

答案 0 :(得分:3)

不是yield,尽管你可以使用std::iterator编写惰性迭代器(参见this answer)。您不必在Python中使用yield,而是从operator++返回下一个元素。

答案 1 :(得分: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;
}