namespace std {
template <class R, class... ArgTypes>
packaged_task(R(*)(ArgTypes...))
-> packaged_task<R(ArgTypes...)>; // (1) C++20
template <class F>
packaged_task(F)
-> packaged_task<Signature>; // (2) C++20
}
概要
std::packaged_task
クラステンプレートの型推論補助。
- (1) : 関数ポインタからの推論
- (2) : 関数オブジェクトからシグニチャの推論。このオーバーロードは、関数呼び出し演算子がひとつだけオーバーロードされている場合に有効
テンプレートパラメータ制約
- (2) :
&F::operator()
は評価されないオペランドとして扱われ、以下のいずれかの場合に適格である:- C++17 :
decltype(&F::operator())
は、型G
があるとして、R(G::*)(A...) cv &(opt) noexcept(opt)
形式であること
- C++26 :
F::operator()
が非静的メンバ関数であり、decltype(&F::operator())
は、型G
があるとして、R(G::*)(A...) cv &(opt) noexcept(opt)
形式もしくはR(*)(G cv ref(opt), A...) noexcept(opt)
形式であることF::operator()
静的メンバ関数であり、decltype(&F::operator())
はR(*)(A...) noexcept(opt)
形式であること
- C++17 :
例
#include <iostream>
#include <future>
int foo(int, char) { return 0; }
struct Functor {
int operator()(double) { return 1; }
};
int main()
{
// (1)
// 関数ポインタからの型推論
std::packaged_task f{foo};
f(1, '3');
std::cout << f.get_future().get() << std::endl;
// (2)
// 関数オブジェクトからの型推論。
// 関数呼び出し演算子がひとつだけオーバーロードされていること
std::packaged_task g{Functor{}};
g(1.23);
std::cout << g.get_future().get() << std::endl;
// (3)
// ラムダ式からの型推論
std::packaged_task h{[](int) { return 2; }};
h(3);
std::cout << h.get_future().get() << std::endl;
}
出力
0
1
2
バージョン
言語
- C++20
処理系
- Clang: 18 ✅
- GCC: 11 ✅
- Visual C++: ??
関連項目
- C++17 クラステンプレートのテンプレート引数推論
- C++23
this
ポインタをもつ必要のない演算子をstatic
として宣言できるようにする - C++23 自身のオブジェクトを明示的にパラメータとして指定する