Шаблон классаpackaged_task определяет тип оболочки для функции или вызываемого объекта, чтобы возвращаемое значение функции или вызываемого объекта сохранялось в будущем при его вызове.
Когдаpackaged_task объект вызывается, вызывается его сохраненная задача, а результат (нормальный или исключительный) сохраняется в общем состоянии. Любые фьючерсы, которые разделяют общее состояние, затем смогут получить доступ к сохраненному результату.
namespace std { template<class> class packaged_task; // not defined template<class R, class... ArgTypes> class packaged_task<R(ArgTypes...)> { public: // construction and destruction packaged_task() noexcept; template <class F> explicit packaged_task(F&& f); ~packaged_task(); // no copy packaged_task(const packaged_task&) = delete; packaged_task& operator=(const packaged_task&) = delete; // move support packaged_task(packaged_task&& rhs) noexcept; packaged_task& operator=(packaged_task&& rhs) noexcept; void swap(packaged_task& other) noexcept; bool valid() const noexcept; // result retrieval future<R> get_future(); // execution void operator()(ArgTypes... ); void make_ready_at_thread_exit(ArgTypes...); void reset(); }; template <class R, class... ArgTypes> void swap(packaged_task<R(ArgTypes...)>& x, packaged_task<R(ArgTypes...)>& y) noexcept; template <class R, class Alloc> struct uses_allocator<packaged_task<R>, Alloc>; }
packaged_task() noexcept;
template <class F>
packaged_task(F&& f);
Requires: INVOKE<R>(f, t1, t2, ..., tN), гдеt1, t2, ..., tN - значения соответствующих типов вArgTypes..., должно быть допустимым выражением. Вызов копииf должен вести себя так же, как и вызовf.
Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, еслиdecay_t<F> он того же типа, что иpackaged_task<R(ArgTypes...)>.
Effects: Создает новыйpackaged_task объект с общим состоянием и инициализирует сохраненную задачу объекта с помощьюstd::forward<F>(f).
Throws:
Любые исключения, создаваемые конструктором копирования или перемещенияf.
Для первой версии, bad_alloc если не удалось выделить память для внутренних структур данных.
Для второй версии любые исключения, созданныеallocator_traits<Allocator>::template rebind_traits<unspecified>::allocate.
packaged_task(packaged_task&& rhs) noexcept;
Effects: Создает новыйpackaged_task объект и передает владение rhsобщим состоянием*this, оставив егоrhs без общего состояния. Перемещает сохраненную задачу изrhs в*this.
packaged_task& operator=(packaged_task&& rhs) noexcept;
Effects:
Освобождает любое разделяемое состояние ([futures.state]);
звонкиpackaged_task(std::move(rhs)).swap(*this).
~packaged_task();
Effects: Отменяет любое общее состояние ([futures.state]).
void swap(packaged_task& other) noexcept;
Postconditions:*this имеет такое же общее состояние и сохраненную задачу (если есть), что иother до вызоваswap.other имеет такое же общее состояние и сохраненную задачу (если есть), что и*this до вызоваswap.
bool valid() const noexcept;
future<R> get_future();
void operator()(ArgTypes... args);
Effects: Как будто поINVOKE<R>(f, t1, t2, ..., tN), гдеf хранится задача*this и t1, t2, ..., tN значения вargs.... Если задача возвращается нормально, возвращаемое значение сохраняется как асинхронный результат в общем состоянии *this, в противном случае сохраняется исключение, созданное задачей. Общее состояние*this готово, и все потоки, заблокированные в функции, ожидающие*this готовности общего состояния , разблокируются.
Throws: future_error объект исключения , если нет общегосударственных или сохраненное задание уже вызван.
void make_ready_at_thread_exit(ArgTypes... args);
Effects: Как будто поINVOKE<R>(f, t1, t2, ..., tN), гдеf хранится задача, а t1, t2, ..., tN какие - значения вargs.... Если задача возвращается нормально, возвращаемое значение сохраняется как асинхронный результат в общем состоянии *this, в противном случае сохраняется исключение, созданное задачей. В любом случае это должно быть сделано без[futures.state]немедленного преобразования этого состояния в состояние ready ( ). Планирует подготовить общее состояние к моменту выхода из текущего потока после того, как все объекты продолжительности хранения потока, связанные с текущим потоком, будут уничтожены.
void reset();
Effects: Как будто*this = packaged_task(std::move(f)), где f хранится задача *this. [ Note: Это создает новое общее состояние для*this. Старое состояние заброшено ([futures.state]). ] — end note
template <class R, class... ArgTypes>
void swap(packaged_task<R(ArgTypes...)>& x, packaged_task<R(ArgTypes...)>& y) noexcept;
template <class R, class Alloc>
struct uses_allocator<packaged_task<R>, Alloc>
: true_type { };