Преобразование задачи<T> в задачу<void>
Есть ли способ упростить следующий код, чтобы избежать .then
называть это "преобразует" мой task<int>
в task<void>
?
Я не могу изменить подпись функции MyClass::MyFunction1
потому что это часть публичного API.
task<void> MyClass::MyFunction1()
{
return MyFunction2().then([](int) {});
}
task<int> MyClass::MyFunction2()
{
// Some code here
}
1 ответ
concurrency::task
класс шаблона, поэтому concurrency::task<int>
а также concurrency::task<void>
два разных класса. Экземпляры одного из них не могут быть разыграны или преобразованы в другое.
Поэтому ваш подход несколько верен. Однако вы не конвертируете, вы просто создаете новый task<void>
экземпляр, который будет выполнен task<int>
вернулся Method2()
после того, как это сделано. Это немного скрывает то, что вы на самом деле пытаетесь сделать, и может усложнить поддержку кода в будущем. Я думаю, что лучший подход заключается в создании и возвращении task<void>
что заключает в капсулу Method2()
и ждет его завершения:
concurrency::task<void> MyFunction1()
{
return concurrency::task<void>{[]()
{
MyFunction2().wait();
}};
}
Это немного более прямолинейно и чисто, тем более что task<void>
что вызывающий абонент на самом деле выполняет все MyFunction2()
выполняется.
В любом случае, поскольку типы несовместимы, невозможно создать новый task<void>
пример.