C++20引入了协程,这是一种可以暂停和恢复执行的函数。以下是一个简单的C++协程例子:
cpp
#include <iostream>
#include <coroutine>
#include <future>
template<typename T>
struct Generator {
struct promise_type;
using handle_type = std::coroutine_handle<promise_type>;
struct promise_type {
T value;
auto get_return_object() { return Generator{handle_type::from_promise(*this)}; }
auto initial_suspend() { return std::suspend_always{}; }
免费模板生成器 auto final_suspend() noexcept { return std::suspend_always{}; }
void unhandled_exception() { std::terminate(); }
void return_void() {}
auto yield_value(T value) {
this->value = value;
return std::suspend_always{};
}
};
bool move_next() { return !coro.done(); }
T current_value() { return coro.promise().value; }
Generator(Generator const&) = delete;
Generator(Generator && rhs) : ) { = nullptr; }
~Generator() { if (coro) coro.destroy(); }
private:
Generator(handle_type h) : coro(h) {}
handle_type coro;
};
Generator<int> range(int start, int end) {
for (int i = start; i < end; ++i) {
co_yield i;
}
}
int main() {
auto gen = range(1, 5);
while (ve_next()) {
std::cout << gen.current_value() << std::endl;
}
return 0;
}
这个例子中,我们定义了一个名为Generator的模板类,用于创建生成器。我们还定义了一个名为range的生成器函数,它接受两个整数参数start和end,并使用co_yield关键字在这两
个整数之间生成一个序列。在main函数中,我们创建了一个range生成器实例,并使用move_next和current_value方法遍历生成的序列。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论