std:: noop_coroutine
From cppreference.net
C++
Utilities library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Coroutine support
| Coroutine traits | ||||
|
(C++20)
|
||||
| Coroutine handle | ||||
|
(C++20)
|
||||
| No-op coroutines | ||||
|
(C++20)
|
||||
|
noop_coroutine
(C++20)
|
||||
| Trivial awaitables | ||||
|
(C++20)
|
||||
|
(C++20)
|
||||
| Range generators | ||||
|
(C++23)
|
|
ヘッダーで定義
<coroutine>
|
||
|
std::
noop_coroutine_handle
noop_coroutine
(
)
noexcept
;
|
(C++20以降) | |
何もしないコルーチンを参照するコルーチンハンドルを返します。
no-opコルーチンのコルoutine状態が既に存在する場合、後続の
noop_coroutine
呼び出しが以前に取得したコルーチンハンドルを返すか、新たなno-opコルーチンのコルーチン状態を参照するコルーチンハンドルを返すかは未規定です。
目次 |
パラメータ
(なし)
戻り値
無操作コルーチンを参照する std::noop_coroutine_handle 。
注記
noop_coroutine
への異なる呼び出しからの戻り値は、
等しく比較される場合とされない場合があります。
noop_coroutine
は、コルーチンを開始せずにコルーチン状態オブジェクトを参照する
noop_coroutine_handle
のみを返すことができます。
例
このコードを実行
#include <coroutine> #include <iostream> #include <utility> template<class T> struct task { struct promise_type { auto get_return_object() { return task(std::coroutine_handle<promise_type>::from_promise(*this)); } std::suspend_always initial_suspend() { return {}; } struct final_awaiter { bool await_ready() noexcept { return false; } void await_resume() noexcept {} std::coroutine_handle<> await_suspend(std::coroutine_handle<promise_type> h) noexcept { // final_awaiter::await_suspend は、以下の実行が中断されたときに呼び出されます // 現在のコルーチン('h'によって参照される)は終了しようとしています。 // 現在のコルーチンが別のコルーチンによって再開された場合 // co_await get_task(), そのコルーチンへのハンドルが格納されました // h.promise().previous として。その場合、再開するためのハンドルを返す // 前のコルーチン。 // それ以外の場合、再開しても何も行わない noop_coroutine() を返す。 if (auto previous = h.promise().previous; previous) return previous; else return std::noop_coroutine(); } }; final_awaiter final_suspend() noexcept { return {}; } void unhandled_exception() { throw; } void return_value(T value) { result = std::move(value); } T result; std::coroutine_handle<> previous; }; task(std::coroutine_handle<promise_type> h) : coro(h) {} task(task&& t) = delete; ~task() { coro.destroy(); } struct awaiter { bool await_ready() { return false; } T await_resume() { return std::move(coro.promise().result); } auto await_suspend(std::coroutine_handle<> h) { coro.promise().previous = h; return coro; } std::coroutine_handle<promise_type> coro; }; awaiter operator co_await() { return awaiter{coro}; } T operator()() { coro.resume(); return std::move(coro.promise().result); } private: std::coroutine_handle<promise_type> coro; }; task<int> get_random() { std::cout << "in get_random()\n"; co_return 4; } task<int> test() { task<int> v = get_random(); task<int> u = get_random(); std::cout << "in test()\n"; int x = (co_await v + co_await u); co_return x; } int main() { task<int> t = test(); int result = t(); std::cout << result << '\n'; }
出力:
test() 内 get_random() 内 get_random() 内 8
関連項目
|
(C++20)
|
観測可能な効果を持たないコルーチンに使用される
(クラス) |
|
(C++20)
|
std::
coroutine_handle
<
std::
noop_coroutine_promise
>
、ノーオペレーションコルーチンを参照することを意図
(typedef) |