«Сгладить» вложенные фьючерсы
-
27-10-2019 - |
Вопрос
У меня есть вспомогательная функция, которую я использую для "сглаживания" вложенных фьючерсов в единое будущее:
РЕДАКТИРОВАТЬ: "Сгиб" переименован в "Сглаживание", как предлагалось.
Я использую фьючерсы из библиотеки boost:
родовое словоОн используется так:
родовое словоПроблема в том, что это работает только в том случае, если я конвертирую "вложенное" будущее в общий кодовый код.Есть ли хороший способ обойти это?Я бы хотел что-то вроде:
родовое словоВо-вторых, я немного не уверен в названии метода.Есть мнения?
Решение
(Примечание: я не понимаю, как у вас есть boost::unique_future
для взаимодействия с std::async
, поэтому я заменил все экземпляры boost::unique_future
на std::future
. Код был протестирован и работает с моей стороны.)
Проблема в том, что лямбда-выражения захватываются либо по значению (что на самом деле означает захват копированием), либо по ссылке (здесь не применимо, поскольку мы хотим связать время жизни будущего с нашим закрытием), тогда как std::future
предназначен только для перемещения. Ответом на это обычно является std::bind
, хотя в этом случае std::async
имеет встроенную функциональность, подобную bind
:
Боюсь, у меня нет подходящего имени для рекомендации. Если бы шаблон, возможно, работал рекурсивно для преобразования любого std::future<std::future<std::future<...std::future<T>...>>>
в std::future<T>
, то, возможно, я бы вызвал if flatten_future
. Или, возможно, просто сгенерировать кодовый код, поскольку в конце концов он принимает только сгенерированный кодовый код.
Предполагая, что у нас уже есть унарный кодовый код:
родовое слово