最終更新日時: 2025年07月12日 02時16分44秒 (JST)
Koichi Murase が更新

履歴 編集

class template
<future>

# std::packaged_task(C++11)

    namespace std {
      template <class> class packaged_task; // 宣言のみで定義なし

      template <class R, class... ArgTypes>
      class packaged_task<R(ArgTypes...)>;
    }

## 概要

`packaged_task`は、「別スレッドでの処理完了を待ち、その処理結果を取得する」といった非同期処理を実現するためのクラスであり、`future`クラスと組み合わせて使用する。`packaged_task`に登録した非同期実行する関数の戻り値を`future`が読み取る。

`packaged_task`と`future`は内部的に同一の共有状態を参照する。

テンプレートパラメータ：

- `R(ArgTypes...)` ： 非同期実行する関数のシグニチャ。`R`が戻り値の型、`ArgTypes...`が引数の型

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++11
`(destructor)` | デストラクタ | C++11
`operator=` | 代入演算子 | C++11
`swap` | 他の`packaged_task`オブジェクトと値を入れ替える | C++11
`valid` | 共有状態を持っているかを確認する | C++11
`reset` | 共有状態を作り直す | C++11

### 結果の取得

名前 | 説明 | 対応バージョン
--- | --- | ---
`get_future` | 結果取得のための`future`オブジェクトを取得する | C++11

### 実行

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator()` | タスクを実行し、戻り値を共有状態に格納する | C++11
`make_ready_at_thread_exit` | タスクを実行し、スレッド終了時に準備完了状態にする | C++11

## 非メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`swap` | 2つの`packaged_task`オブジェクトを入れ替える | C++11

## 推論補助

名前 | 説明 | 対応バージョン
--- | --- | ---
`(deduction_guide)` | クラステンプレートの推論補助 | C++20

## その他

名前 | 説明 | 対応バージョン
--- | --- | ---
`uses_allocator` | `packaged_task`による特殊化 | C++11

## 例

    #include <iostream>
    #include <thread>
    #include <future>
    #include <utility>

    int calc()
    {
      int sum = 0;
      for (int i = 0; i < 10; ++i) {
        sum += i + 1;
      }
      return sum;
    }

    int main()
    {
      std::packaged_task<int()> task(calc); // 非同期実行する関数を登録する
      std::future<int> f = task.get_future();

      // 別スレッドで計算を行う
      std::thread t(std::move(task));
      t.detach();

      try {
        // 非同期処理の結果値を取得する
        std::cout << f.get() << std::endl;
      }
      catch (...) {
        // 非同期実行している関数内で投げられた例外を捕捉
      }
    }

### 出力

    55

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2012 ✅

## 参照