以下是代码:
// Example program
#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include <coroutine>
template <typename T>
class Generator {
public:
struct promise_type {
T value;
std::suspend_always yield_value(T v) { value = v; return {}; }
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
Generator get_return_object() { return Generator{ Handle::from_promise(*this) }; }
};
struct Handle : std::coroutine_handle<promise_type> {
Handle(std::coroutine_handle<promise_type> h) : std::coroutine_handle<promise_type>(h) {}
T& operator()() { return this->promise().value; }
void operator++() { this->resume(); }
};
Generator(Handle h) : handle(h) {}
~Generator() { if (handle) handle.destroy(); }
T& operator()() { return handle(); }
void operator++() { ++handle; }
explicit operator bool() { return !handle.done(); }
//private:
Handle handle{};
};
Generator<int> generateNumbers(int start, int end) {
for (int i = start; i <= end; ++i) {
co_yield i;
}
}
int main()
{
auto gen = generateNumbers(1, 10); // Adjust the range as needed
while (gen) {
if(gen.handle.done()) // I also tried directly accessing the handle, but this did also not work.
break;
std::cout << gen() << std::endl;
++gen;
}
}
在这段代码中,我创建了一个生成器作为协程生成器类。现在我想使用这个生成器在generateNumbers函数中生成一些数字。我从 main 调用它并尝试迭代这些数字。问题是当我想检查迭代是否结束时。我尝试暂时将生成器检查为布尔值。被覆盖的布尔运算符调用handle.done(),我检查了调试器,它确实这样做了。问题是,handle.done() 总是返回 false,即使循环确实结束了。我尝试直接从循环内调用handle.done(),这也不起作用。
我正在使用支持 C++20 标准的编译器。
你能帮助我理解我的错误吗?非常感谢。
done()
返回true
。
您的
final_suspend()
返回 std::suspend_never
,因此协程不会在其最终暂停点暂停。您需要更改它才能返回std::suspend_always
。