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 이면 프로그램은 ill-formed입니다. |
(C++20 이후) |
std::packaged_task
는 이동 전용(move-only)입니다.
std::packaged_task
를 공유 상태와
rhs
가 이전에 소유하던 태스크로 생성하며,
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 << "Starting task\n"; auto result = fib_task.get_future(); std::thread t(std::move(fib_task), 42); std::cout << "Waiting for task to finish..." << std::endl; std::cout << result.get() << '\n'; std::cout << "Task complete\n"; t.join(); }
출력:
Starting task Waiting for task to finish... 267914296 Task complete
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 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를 고려함 |