这个问题在这里已有答案:
我刚刚了解了python中的yield关键字 - 非常令人印象深刻且非常有用。
在C和C ++语言中是否有任何等价物?
虽然你可以使用yield
编写惰性迭代器(参见std::iterator
),但不是this answer。而不是像Python中那样使用yield
,而是从operator++
返回下一个元素。
没有。
实现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;
}