Вопрос

У меня есть вспомогательная функция, которую я использую для "сглаживания" вложенных фьючерсов в единое будущее:

РЕДАКТИРОВАТЬ: "Сгиб" переименован в "Сглаживание", как предлагалось.

Я использую фьючерсы из библиотеки 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. Или, возможно, просто сгенерировать кодовый код, поскольку в конце концов он принимает только сгенерированный кодовый код.


Предполагая, что у нас уже есть унарный кодовый код:

родовое слово
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top