<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)
>.