std::packaged_task<R(Args...)>:: packaged_task
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
packaged_task::packaged_task
|
||||
| Getting the result | ||||
| Execution | ||||
| Non-member functions | ||||
| Helper classes | ||||
|
(until C++17)
|
||||
| Deduction guides (C++17) |
|
packaged_task
(
)
noexcept
;
|
(1) | (C++11以降) |
|
template
<
class
F
>
explicit packaged_task ( F && f ) ; |
(2) | (C++11以降) |
|
template
<
class
F,
class
Allocator
>
explicit packaged_task ( std:: allocator_arg_t , const Allocator & a, F && f ) ; |
(3) |
(C++11以降)
(C++17まで) |
|
packaged_task
(
const
packaged_task
&
)
=
delete
;
|
(4) | (C++11以降) |
|
packaged_task
(
packaged_task
&&
rhs
)
noexcept
;
|
(5) | (C++11以降) |
std::packaged_task
オブジェクトを新しく構築します。
std::packaged_task
オブジェクトを構築します。
std::packaged_task
オブジェクトを構築し、格納タスクの型を
std::
decay
<
F
>
::
type
とし、共有状態を持つ。格納タスクは
std::
forward
<
F
>
(
f
)
で初期化される。
|
これらのオーバーロードは、 std:: decay < F > :: type が std:: packaged_task < R ( Args... ) > と同じ型でない場合にのみ、オーバーロード解決に参加する。
t1
,
t2
, ...,
tN
を
|
(C++20まで) |
|
このオーバーロードは、 std:: remove_cvref_t < F > が std:: packaged_task < R ( Args... ) > と同じ型でない場合にのみ、オーバーロード解決に参加する。 std:: is_invocable_r_v < R, std:: decay_t < F > & , Args... > が false の場合、プログラムは不適格となる。 |
(C++20以降) |
std::packaged_task
はムーブオンリーです。
std::packaged_task
を構築し、
rhs
は共有状態を持たず、ムーブ済みのタスクとなる。
目次 |
パラメータ
| f | - | 実行する呼び出し可能なターゲット |
| a | - | タスク保存時に使用するアロケータ |
| rhs | - |
移動元の
std::packaged_task
|
例外
allocate
関数によってスローされる例外。
例
#include <future> #include <iostream> #include <thread> int fib(int n) { if (n < 3) return 1; else return fib(n - 1) + fib(n - 2); } int main() { std::packaged_task<int(int)> fib_task(&fib); std::cout << "タスクを開始します\n"; auto result = fib_task.get_future(); std::thread t(std::move(fib_task), 42); std::cout << "タスク完了を待機中..." << std::endl; std::cout << result.get() << '\n'; std::cout << "タスク完了\n"; t.join(); }
出力:
タスクを開始します タスク完了を待機中... 267914296 タスク完了
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2067 | C++11 |
コピーコンストラクタのパラメータ型は
packaged_task&
であった
|
const を追加 |
| LWG 2097 | C++11 |
オーバーロード
(2,3)
において、
F
が
std::packaged_task<R(Args...)>
となる可能性があった
|
F
に制約を追加
|
| LWG 4154 | C++11 | オーバーロード (2,3) でdecayを考慮していなかった | decayを考慮 |