Преобразование задачи<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> пример.

Другие вопросы по тегам