template<class Initializer>
explicit stop_callback(const stop_token& st, Initializer&& init)
noexcept(is_nothrow_constructible_v<CallbackFn, Initializer>); // (1)
template<class Initializer>
explicit stop_callback(stop_token&& st, Initializer&& init)
noexcept(is_nothrow_constructible_v<CallbackFn, Initializer>); // (2)
stop_callback(const stop_callback&) = delete; // (3)
stop_callback(stop_callback&&) = delete; // (4)
概要
- (1) :
stop_tokenの左辺値参照を受け取り、そのstop_tokenが所有する停止状態への停止要求に応じて呼び出されるコールバックを登録する。 - (2) :
stop_tokenの右辺値参照を受け取り、そのstop_tokenが所有する停止状態への停止要求に応じて呼び出されるコールバックを登録する。 - (3) : コピーコンストラクタ。コピー不可。
- (4) : ムーブコンストラクタ。ムーブ不可。
テンプレートパラメータ制約
クラステンプレートのテンプレート引数CallbackFnとコンストラクタのテンプレート引数Initializerはconstructible_from<CallbackFn, Initializer>制約を満たすこと。
効果
説明専用のメンバ変数callback-fnをstd::forward<CallbackFn>(init)で初期化し、停止可能コールバック登録を実行する(備考欄を参照)。
コールバックがstの停止状態に登録されたた場合、*thisが停止状態の所有権を共有する。
例外
説明専用のメンバ変数callback-fnをinitで初期化する際に例外が発生する場合は、その例外を送出する。
備考
停止可能コールバック登録は次のように行われる。
もしst.stop_requested() == true の場合は、コンストラクタを呼び出したスレッドの中でstd::forward<CallbackFn>(callback-fn)()を評価し、コールバックを呼び出す。したがってこのコールバックの呼び出しはコンストラクタから処理が戻るより前に完了する。
そうでない場合は、stが所有している停止状態への所有権を取得して停止状態を共有し、その停止状態に対する最初のrequest_stop()の呼び出しでstd::forward<CallbackFn>(callback-fn)()を評価するようなコールバックを登録する。
stが停止状態を所有していない場合は何もしない。
もしstd::forward<CallbackFn>(callback-fn)()の呼び出しが例外によって終了した場合は、std::terminate()関数が呼び出され、プログラムが異常終了する。
例
#include <cassert>
#include <stop_token>
#include <string>
int main()
{
std::string msg;
std::stop_source ss;
std::stop_token st = ss.get_token();
std::stop_callback cb1(st, [&] { msg += "hello"; });
assert(msg == "");
ss.request_stop();
// 停止要求が作成される前に登録されていたコールバック関数は、
// 停止要求が作成された際にその中で呼び出される
assert(msg == "hello");
std::stop_callback cb2(st, [&] { msg += " world"; });
// 停止要求が作成されたあとに登録されたコールバック関数は、
// std::stop_callback のコンストラクタの中で即座に呼び出される
assert(msg == "hello world");
}
出力
バージョン
言語
- C++20
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??