下面一个示例说明co_await 的用法。
template<class T>
struct generator
{
struct promise_type
{
std::suspend_never initial_suspend() const noexcept { std::cout<<"initial_suspend"<<std::endl; return {}; }
std::suspend_never final_suspend() const noexcept { std::cout<<"final_suspend"<<std::endl; return {}; }
void unhandled_exception() noexcept { }
generator<T> get_return_object() noexcept
{
std::cout<<"get_return_object"<<std::endl; return {};
}
auto await_transform(T id)
{
return await_op {id};
}
struct await_op
{
bool await_ready() const noexcept
{
std::cout<<"await_ready"<<std::endl;
return _id%2;
}
void await_suspend(std::coroutine_handle<> cont) const
{
std::cout<<"await_suspend"<<std::endl;
}
T await_resume()
{
std::cout<<"await_resume"<<std::endl;
return _id+1;
}
T _id;
};
};
};
generator<int> co_fun2()
{
std::cout << "============co_fun2"<<std::endl;
int id=co_await 1;
std::cout << "co_await:"<<id<<std::endl;
}
generator<int> co_fun3()
{
std::cout << "============co_fun3"<<std::endl;
int id=co_await 2;
std::cout << "co_await:"<<id<<std::endl;
}
int main()
{
co_fun2();
std::cout<<std::endl;
co_fun3();
std::cout<<"