<packaged_task<>>заворачивает вызывающую мишень, которая возвращает значение так, что возвращаемое значение может быть вычислено асинхронно.
Обычное использование<packaged_task<>>выглядит следующим образом:
- Обосновывать<
packaged_task<>>шаблонными аргументами, соответствующими подписи вызывающего вызова. Позволяет обращаться кконструктору.
- Звони.<
packaged_task::get_future()>и захват возвратившихся<future<>>Пример.
- Запустите<
fiber>, чтобы запустить новый<packaged_task<>>, передав любые аргументы, требуемые исходным вызовом.
- Призывайте<
fiber::detach()>к новому<fiber>.
- В более поздний момент извлеките результат из<
future<>>.
Это, по сути, то, что<fibers::async()>инкапсулирует.
#include <boost/fiber/future/packaged_task.hpp>
namespace boost {
namespace fibers {
template< class R, typename ... Args >
class packaged_task< R( Args ... ) > {
public:
packaged_task() noexcept;
template< typename Fn >
explicit packaged_task( Fn &&);
template< typename Fn, typename Allocator >
packaged_task( std::allocator_arg_t, Allocator const&, Fn &&);
packaged_task( packaged_task &&) noexcept;
packaged_task & operator=( packaged_task &&) noexcept;
packaged_task( packaged_task const&) = delete;
packaged_task & operator=( packaged_task const&) = delete;
~packaged_task();
void swap( packaged_task &) noexcept;
bool valid() const noexcept;
future< R > get_future();
void operator()( Args ...);
void reset();
};
template< typename Signature >
void swap( packaged_task< Signature > &, packaged_task< Signature > &) noexcept;
}}
packaged_task() noexcept;
- Effects:
Построение объекта класса<packaged_task>безобщего состояния.
- Throws:
Ничего.
template< typename Fn >
explicit packaged_task( Fn && fn);
template< typename Fn, typename Allocator >
packaged_task( std::allocator_arg_t, Allocator const& alloc, Fn && fn);
- Effects:
Конструирует объект класса<packaged_task>собщим состояниеми копирует или перемещает вызывающую цель<fn>во внутреннее хранилище.
- Throws:
Исключения, вызванные выделением памяти.
- Note:
<Fn>должен иметь кабриолет возвратного типа<R>.
- See also:
<std::allocator_arg_t>
packaged_task( packaged_task && other) noexcept;
- Effects:
Создает упакованную задачу, перемещаяобщее состояниеиз<other>.
- Postcondition:
<other>не содержит действительного общего состояния.
- Throws:
Ничего.
~packaged_task();
- Effects:
Уничтожает<*this>и оставляетобщее состояние, если общее состояние готово; в противном случае сохраняет<future_error>с условием ошибки<future_errc::broken_promise>, как если бы<promise::set_exception()>: Единое государство готово.
packaged_task & operator=( packaged_task && other) noexcept;
- Effects:
,,<*this>, [скрыто], [скрыто].
- Postcondition:
<other>не содержит действительного общего состояния.
- Throws:
Ничего.
void swap( packaged_task & other) noexcept;
- Effects:
,,<*this>, [<*this>, [<*this>].
- Throws:
Ничего.
bool valid() const noexcept;
- Effects:
Возвращается<true>, если<*this>содержитобщее состояние.
- Throws:
Ничего.
future< R > get_future();
- Returns:
<future<>>с тем жеобщим состоянием.
- Throws:
<future_error>с<future_errc::future_already_retrieved>или<future_errc::no_state>.
void operator()( Args && ... args);
void reset();
- Effects:
Сбрасываетобщее состояниеи отказывается от результата предыдущих казней. Построено новое общее государство.
- Throws:
<future_error>с<future_errc::no_state>.
template< typename Signature >
void swap( packaged_task< Signature > & l, packaged_task< Signature > & r) noexcept;
- Effects:
То же самое<l.swap(
r)>.